Comment mettre un caractère spécial de nouvelle ligne dans un fichier en utilisant la commande echo et l'opérateur de redirection?

29

Je voudrais créer un fichier en utilisant la commande echo et l'opérateur de redirection, le fichier doit être composé de quelques lignes.

J'ai essayé d'inclure une nouvelle ligne par "\ n" dans la chaîne:

echo "first line\nsecond line\nthirdline\n" > foo

mais de cette façon, aucun fichier avec trois lignes n'est créé, mais un fichier avec une seule ligne et le contenu textuel de la chaîne.

Comment puis-je créer en utilisant uniquement cette commande un fichier avec plusieurs lignes?

Abdul Al Hazred
la source
stackoverflow.com/questions/8467424/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

30

Vous avez demandé d'utiliser une syntaxe avec la echocommande:

echo $'first line\nsecond line\nthirdline' > foo

(Mais considérez également l'autre réponse que vous avez obtenue.)

La $'...'construction développe les séquences d'échappement ANSI intégrées.

Janis
la source
1
Notez qu'il ne s'agit pas de POSIX, sa disponibilité dépend en grande partie du shell que vous utilisez.
Chris Down
1
Vous trouvez cette construction dans les coquilles proéminentes (au moins), ksh, bash, zsh (et peut-être d'autres).
Janis
1
@ChrisDown, ce n'est pas encore POSIX, mais il est prévu de l'inclure dans le problème 8. ksh93, bash, zsh, mksh, FreeBSD sh le supportent.
Stéphane Chazelas
24

Ce que fait l'écho avec les échappements de caractères est défini par l'implémentation. Dans de nombreuses implémentations d'écho (y compris les plus modernes), la chaîne passée n'est pas du tout examinée pour les échappements par défaut.

Avec l'écho fourni par GNU bash (en tant que intégré), et certaines autres variantes d'écho, vous pouvez faire quelque chose comme ceci:

echo -en 'first line\nsecond line\nthird line\n' > file

Cependant, cela ressemble vraiment à ce que vous voulez printf, ce qui est plus lisible à mes yeux et plus portable aussi (il a cette fonctionnalité définie par POSIX):

printf '%s\n' 'first line' 'second line' 'third line' > file

Vous pouvez également envisager d'utiliser un document ici :

cat > file << 'EOF'
first line
second line
third line
EOF
Chris Down
la source
j'ai essayé votre chat> fichier << 'EOF' dans la coquille, et quand je frappe entrée, j'ai reçu cette invite en forme avec chaque ligne, mais je n'ai pas pu en sortir même en appuyant sur ctrl + x ou ctrl + z
Abdul Al Hazred
Vous devez taper EOF seul dans une ligne d'entrée ...
Rmano
2
@mikeserv Êtes-vous facétieux ou sérieux?
Matthew Read
1
@AbdulAlHazred comme l'indique le lien dans la réponse, cela s'appelle un "document ici" et est très courant. Wikipedia est bon sur ce sujet: en.wikipedia.org/wiki/Here_document .
dave_thompson_085
1
Cela a fonctionné pour mon Mac OSX (en particulier echo -en 'text..', alors que la réponse acceptée ne reconnaissait pas mon caractère de nouvelle ligne ( \n), c'est le echo -encas.)
benjaminmgross
4

Voici quelques autres façons de créer un fichier multiligne à l'aide de la echocommande:

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

où les deuxième et troisième commandes utilisent l' >>opérateur de redirection, ce qui entraîne l'ajout (ajout) de la sortie de la commande au fichier (qui devrait déjà exister, à ce stade).

Ou

(echo "first line"; echo "second line"; echo "third line") > foo

où les parenthèses regroupent les echocommandes en un sous-processus, qui ressemble et agit comme n'importe quel programme unique qui produit plusieurs lignes (comme ls, par exemple).

Une subtile variation de ce qui précède est

{ echo "first line"; echo "second line"; echo "third line";} > foo

Ceci est légèrement plus efficace que la deuxième réponse dans la mesure où il ne crée pas de sous-processus. Cependant, la syntaxe est légèrement plus délicate: notez que vous devez avoir un espace après le {et un point-virgule avant le }.

Voir Quels sont les opérateurs de contrôle et de redirection du shell? pour plus d'informations.

Scott
la source
2

Pour donner encore une autre option, vous pouvez simplement frapper Enter (c'est-à-dire, une nouvelle ligne littérale):

$ echo "the rain in spain
> falls mainly on the plain" > foo

Notez que vous ne tapez pas le >au début de la deuxième ligne. C'est l'invite du shell secondaire $PS2, que le shell imprime lorsque vous tapez une commande incomplète (par exemple, dans ce cas, une commande avec un caractère de guillemet sans correspondance).

gardenhead
la source
0

POSIX 7 dit que vous ne pouvez pas

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e n'est pas défini et les barres obliques inverses sont définies par l'implémentation:

Si le premier opérande est -n, ou si l'un des opérandes contient un caractère <backslash>, les résultats sont définis par l'implémentation.

sauf si vous disposez d'une extension XSI en option.

Utilisez donc à la printfplace:

l'opérande format doit être utilisé comme chaîne de format décrite dans la notation de format de fichier XBD [...]

la notation du format de fichier :

\ n <nouvelle ligne> Déplace la position d'impression au début de la ligne suivante.

Gardez également à l'esprit que Ubuntu 15.10 et la plupart des distributions implémentent les echodeux comme:

  • un Bash intégré: help echo
  • un exécutable autonome: which echo

ce qui peut entraîner une certaine confusion.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source
Il y aura une fonction echointégrée dans chaque shell disponible sur le système. Sur Ubuntu / bin / sh est généralement dash, bash vient également par défaut. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... auront tous leur propre écho avec un comportement différent. Notez que which echocela ne vous donnera pas le chemin de l'écho du système dans tous les shells.
Stéphane Chazelas
@ StéphaneChazelas "dont l'écho ne vous donnera pas le chemin de l'écho du système dans tous les shells." Que je ne savais pas, que pouvait-il donner d'autre?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Essayez en tcsh ou zsh. whichétait à l'origine (dans les années 80) un script csh pour les utilisateurs csh uniquement (chargé les alias à partir de ~ / .cshrc) et est toujours sur certains systèmes. whichest un intégré dans zsh et tcsh.
Stéphane Chazelas