En gros, on me donne un fichier texte et je suis censé y aller avec des commandes sed. J'ai environ 7 commandes sed au total et j'ai besoin de toutes les mettre dans un seul script Shell pour produire UNE sortie lorsque ce script est exécuté.
Fichier texte à visser avec: students.txt
Students.txt:
DogG DOGGGGGGGG
dog dog dog Jamesb
JamesBrady
derghnregnrig
JamesBeody
Ainsi, le premier sed se débarrasse de la première et de la dernière ligne. second sed remplace dog par DOGGGG et trouve toutes les lignes avec JamesBrady 4th sed et imprime toutes les lignes avec derghnregnrig
Commandes Sed (exemples de BS):
sed -e '1d' -e '$d' -e '/^$/d' students.txt
sed -n s/dog/DOGGGG/g students.txt
sed -n /JamesBrady/p students.txt
sed -n /derghnregnrig/p students.txt
Les commandes sed ci-dessus doivent toutes être placées dans un seul fichier de script Shell. Lorsqu'elles sont exécutées, elles sont censées générer leurs effets (cumulatifs?) Sur un seul fichier texte (étudiants.txt).
Jusqu'à présent, j'ai essayé de rechercher la procédure appropriée pour le faire et je n'ai rencontré que de la confusion. Quelqu'un peut-il expliquer avec clarté et patience les débutants comment plusieurs commandes sed, et toutes commandes (awk, grep, etc.) sont censées tenir dans un seul fichier de script shell?
Utiliser Ubuntu 16.04, Vim. Bash Shell
Je suppose que vous voulez réellement voir la ligne avec DOGGGG puisque vous la modifiez (sinon, pourquoi se donner la peine?)
Utilisez {} pour regrouper des commandes dans un bloc ...
sed -n '{
1d
$d
/^$/d
s/dog/DOGGGG/g
/DOGGGG/p
/JamesBrady/p
/derghnregnrig/p
}' students.txt
résultat:
DOGGGG DOGGGG DOGGGG Jamesb
JamesBrady
derghnregnrig
Vous n'avez pas besoin de tout cela pour votre exemple ...
sed -n '{
1d
$d
s/dog/DOGGGG/g;p
}' students.txt
mais je suppose que votre vrai fichier contient des lignes vides et des éléments au milieu que vous ne voulez pas imprimer.
Tout d’abord, vérifiez ces commandes sed, elles ne font peut-être pas ce que vous voulez. Par exemple, le second, au lieu de
sed -n s/dog/DOGGGG/g students.txt
Je pense que ça devrait être
sed -i 's/dog/DOGGGG/g' students.txt
Lisez man sed
et assurez-vous qu’ils fonctionnent individuellement avant de créer votre script.
Créez un nouveau fichier (c'est-à-dire nano yourscript.sh) et écrivez #!/bin/bash
suivi de vos commandes sed, en remplaçant students.txt
par $1
. Ce $1
représente le premier argument lorsque vous appelez le script:
#!/bin/bash
sed -e '1d' -e '$d' -e '/^$/d' $1
sed -n s/dog/DOGGGG/g $1
sed -n /JamesBrady/p $1
sed -n /derghnregnrig/p $1
Avec les commandes sed correctes. Maintenant, donnez les autorisations d'exécution du script:
Sudo chmod 755 yourscript.sh
Et exécutez-le, avec le nom du fichier comme premier argument:
Sudo ./yourscript.sh students.txt
Vous n'avez besoin de Sudo dans cette dernière commande que si votre utilisateur n'a pas l'autorisation de modifier le fichier students.txt.
Option 1: placez chaque commande sed
de votre script Shell sur une ligne distincte et faites-la fonctionner à l'aide du commutateur - i.
Option 2: utilisez une seule ligne de commande sed
dans votre script Shell, mais transmettez chaque expression à l'aide d'un commutateur - e distinct.
L'option 2 est préférable si vos expressions sont orthogonales (c'est-à-dire qu'elles ne fonctionnent pas sur les mêmes correspondances).