Combinant 2 commandes

J’ai besoin d’écrire un script shell pour convertir les caractères d’un fichier en minuscules et remplacer les caractères non alpha par _ .

J’ai une commande séparée pour les deux ci-dessus. Comment donner un fichier en argument et effectuer les opérations ci-dessus c’est-à-dire que la sortie n’aura que des caractères minuscules et que les caractères non alpha seront remplacés par _ (trait de soulignement)?

Utilisation de sed :

 sed 's/[^[:alpha:]]/_/g; s/[[:upper:]]/\L&/g' file.txt 

C’est en fait deux commandes sed séparées par ; :

  • s/[^[:alpha:]]/_/g transforme chaque caractère non alphabétique en un _

  • s/[[:upper:]]/\L&/g convertit tous les caractères majuscules en minuscules

Exemple:

 $ cat file.txt fooBAr132323 SpamEgg $ sed 's/[^[:alpha:]]/_/g; s/[[:upper:]]/\L&/g' file.txt foobar______ spamegg 

Approche Python à cela:

 python -c 'import sys;print "\n".join(["".join([char.lower() if char.isalpha() else "_" for char in line]) for line in sys.stdin])' < input_file.txt 

L'idée de base est de scinder chaque ligne en caractères individuels et de vérifier si ce caractère est alphabétique, puis de reconstruire la ligne et de joindre toutes les lignes avec newline pour créer un nouveau fichier.

Testé avec / etc / passwd:

 $ python -c 'import sys;print "\n".join(["".join([char.lower() if char.isalpha() else "_" for char in line]) for line in sys.stdin])' < /etc/passwd | head root_x_____root__root__bin_bash_ daemon_x_____daemon__usr_sbin__usr_sbin_nologin_ bin_x_____bin__bin__usr_sbin_nologin_ sys_x_____sys__dev__usr_sbin_nologin_ sync_x_________sync__bin__bin_sync_ games_x______games__usr_games__usr_sbin_nologin_ man_x______man__var_cache_man__usr_sbin_nologin_ lp_x_____lp__var_spool_lpd__usr_sbin_nologin_ mail_x_____mail__var_mail__usr_sbin_nologin_ news_x_____news__var_spool_news__usr_sbin_nologin_ 

L’autre réponse résout votre problème immédiat, mais une solution pour le cas général de “combinaison de deux commandes” rest à mentionner. Croyez-le ou non, l’écosystème Unix a été conçu dans cet esprit et votre shell vous en donnera certainement le moyen.

Si vous souhaitez alimenter un fichier via un “pipeline” de commandes, utilisez le | (pipe) caractère en bash (vraisemblablement, le shell que vous utilisez).

Il convient également de mentionner quelques autres outils utiles: l’utilitaire “cat” et l’opérateur de redirection “>”.

Supposons que votre fichier s’appelle input.txt et que vous souhaitez l’exécuter via votre pipeline et appeler le résultat output.txt.

Construisons notre commande pièce par pièce:

 $ cat input.txt 

Voici ce “chat” dont je parlais. À toutes fins utiles, il ne produit que le contenu de votre fichier. Ajoutons maintenant la première commande de notre pipeline: la partie “remove non-alphabet”. Je vais prendre un extrait de la commande sed de heemayl pour le faire:

 $ cat input.txt | sed 's/[^[:alpha:]]/_/g' 

L’apprentissage des expressions sed et régulières est une véritable bête, alors contentons-nous que cette commande fasse ce que nous voulons pour le moment. Ajout sur le prochain morceau:

 $ cat input.txt | sed 's/[^[:alpha:]]/_/g' | tr 'AZ' 'az' 

J’ai adopté une approche différente de celle de heemayl pour celle-ci, mais cela fait le même travail. Enfin, mettons la sortie dans la destination souhaitée:

 $ cat input.txt | sed 's/[^[:alpha:]]/_/g' | tr 'AZ' 'az' > output.txt 

Nous y sums, nous l’avons fait. Vous pouvez relier autant de commandes que vous le souhaitez avec les commandes | opérateur, puis placez la sortie dans un fichier en utilisant>. Il s’agit d’une tâche très courante dans l’environnement de ligne de commande. Il est donc bon de savoir ce qui se passe et de s’habituer à l’utiliser. 😉