2010-06-09 6 views
26

Question vraiment simple, comment combiner l'écho et le chat dans le shell, j'essaye d'écrire le contenu d'un fichier dans un autre fichier avec une chaîne préfixée?Combinaison d'écho et de chat sous Unix

Si/tmp/fichier ressemble à ceci:

this is a test 

Je veux courir ceci:

echo "PREPENDED STRING" 
cat /tmp/file | sed 's/test/test2/g' > /tmp/result 

de sorte que/tmp/résultat ressemble à ceci:

PREPENDED STRINGthis is a test2 

Merci.

Répondre

30

Cela devrait fonctionner:

echo "PREPENDED STRING" | cat - /tmp/file | sed 's/test/test2/g' > /tmp/result 
+3

J'aime cette simplicité, mais pour l'exhaustivité devrait avoir l'indicateur -n sur l'écho comme mentionné dans une autre réponse. – Dan

+6

Pour quiconque s'interroge sur le '-' dans les arguments' cat', à partir des pages de manuel: 'Sans FICHIER, ou lorsque FICHIER est -, lisez l'entrée standard.' – SooDesuNe

+2

Le drapeau '-n' ne fonctionne pas toutes les variantes de 'echo', mais c'est surtout une note historique. – reinierpost

11

Essayez:

(printf "%s" "PREPENDED STRING"; sed 's/test/test2/g' /tmp/file) >/tmp/result 

Les parenthèses exécutez la commande (s) à l'intérieur d'un sous-shell, de sorte que la sortie ressemble à un flux unique pour la redirection >/tmp/result.

2

Ou tout simplement utiliser uniquement sed

sed -e 's/test/test2/g 
s/^/PREPEND STRING/' /tmp/file > /tmp/result 
+0

pour "one-liner-ness" utiliser 2 '-e':' sed -e 's/test/test2/g' -e 's/^/PREPEND STRING /' ... ' –

+0

Ceci bien sûr ajoutera la chaîne à chaque ligne du fichier d'entrée. –

+0

Ce qui peut être ce qui est recherché. Sinon: 'sed '1s/^/STRAP PREPENDU /; s/test/test2/g '/ tmp/fichier>/tmp/result' –

0

Ou aussi:

{ echo "PREPENDED STRING" ; cat /tmp/file | sed 's/test/test2/g' } > /tmp/result 
+0

Utilisation inutile de 'cat', par ex. cela fonctionnerait aussi: '{echo" STRING PREPENDED "; sed 's/test/test2/g'; } < /tmp/file >/tmp/résultat' – reinierpost

0

Une autre option: en supposant que la chaîne Prepended ne doit apparaître qu'une seule fois et non pour chaque ligne:

gawk 'BEGIN {printf("%s","PREPEND STRING")} {gsub(/test/, "&2")} 1' in > out 
0

Si c'est toujours pour envoyer un e-mail, n'oubliez pas d'utiliser les fins de ligne CRLF, comme ceci:

echo -e 'To: [email protected]\r' | cat - body-of-message \ 
| sed 's/test/test2/g' | sendmail -t 

Notez que le -e -flag et le \ r l'intérieur de la chaîne.

Paramètre À: de cette manière, vous obtenez le service de messagerie en masse le plus simple au monde.