Comment insérer plusieurs lignes avec sed

10

Je veux ajouter ceci

#this 
##is my 
text

avant la ligne

the specific line 

J'ai essayé

sed -i '/the specific line/i \
#this 
##is my 
text
' text.txt

mais il ajoute seulement dans «texte».

J'ai aussi essayé différentes combinaisons avec \et , " "mais rien ne fonctionnait.

Paul Bernhard Wagner
la source

Réponses:

4

Avec les nouvelles lignes:

% sed -i '/the specific line/i #this\n##is my\ntext' foo

% cat foo
#this
##is my
text
the specific line
UN B
la source
9

Vous manquez la barre oblique inverse à la fin de certaines lignes (et vous avez une nouvelle ligne excessive à la fin de la dernière ligne que vous souhaitez insérer):

sed -i '/the specific line/i \
#this\
##is my\
text' file
% cat file
foo
the specific line
bar

% sed -i '/the specific line/i \
#this\
##is my\
text' file

% cat file
foo
#this 
##is my 
text
the specific line
bar
kos
la source
1

Lorsque la chaîne de remplacement comporte des sauts de ligne et des espaces, vous pouvez utiliser autre chose. Nous allons essayer d'insérer la sortie de ls -lau milieu d'un fichier modèle.

awk 'NR==FNR {a[NR]=$0;next}
    /Insert index here/ {for (i=1; i <= length(a); i++) { print a[i] }}
    {print}'
    <(ls -l) text.txt

Lorsque vous souhaitez insérer quelque chose après une ligne, vous pouvez déplacer la commande {print}ou basculer vers:

sed '/Insert command output after this line/r'<(ls -l) text.txt

Vous pouvez également utiliser sed pour insérer avant une ligne avec

sed 's/Insert command output after this line/ls -l; echo "&"/e' text.txt
Walter A
la source