web-dev-qa-db-fra.com

Placez toutes les commandes sed dans un fichier de script shell

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

3
KMoy

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.

7
Zanna

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.

3
Katu

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).

0
Stephen M. Webb