web-dev-qa-db-fra.com

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

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?

33
Abdul Al Hazred

Vous avez demandé l'utilisation d'une syntaxe avec la commande echo:

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

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

Le $'...' construct développe les séquences d'échappement ANSI intégrées.

35
Janis

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 quelques autres variantes d'écho, vous pouvez faire quelque chose comme ceci:

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

Cependant, on dirait vraiment 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 ici document :

cat > file << 'EOF'
first line
second line
third line
EOF
31
Chris Down

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

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

où les deuxième et troisième commandes utilisent le >> 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 commandes echo 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

C'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.

5
Scott

Pour donner encore une autre option, vous pouvez simplement appuyer sur 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).

2
gardenhead

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 printf à la place:

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

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 echo à la fois comme:

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

ce qui peut entraîner une certaine confusion.