web-dev-qa-db-fra.com

Comment insérer un saut de ligne / saut de ligne après une ligne utilisant sed

Il m'a fallu un certain temps pour comprendre comment procéder, donc publier au cas où quelqu'un d'autre chercherait la même chose.

28
realityloop

Pour ajouter une nouvelle ligne après un modèle, vous pouvez également dire:

sed '/pattern/{G;}' filename

Citer manuel GNU sed :

G
    Append a newline to the contents of the pattern space, and then append the contents of the hold space to that of the pattern space.

MODIFIER:

Soit dit en passant, cela se trouve être couvert par sed one liners :

 # insert a blank line below every line which matches "regex"
 sed '/regex/G'
27
devnull

Cette commande sed:

sed -i '' '/pid = run/ a\
\
' file.txt

Trouve la ligne avec: pid = run

file.txt avant

; Note: the default prefix is /usr/local/var
; Default Value: none
;pid = run/php-fpm.pid

; Error log file

et ajoute un saut de ligne après cette ligne dans file.txt

file.txt après

; Note: the default prefix is /usr/local/var
; Default Value: none
;pid = run/php-fpm.pid


; Error log file

Ou si vous souhaitez ajouter du texte et un saut de ligne:

sed -i '/pid = run/ a\
new line of text\
' file.txt

file.txt après

; Note: the default prefix is /usr/local/var
; Default Value: none
;pid = run/php-fpm.pid
new line of text

; Error log file
8
realityloop

Une simple substitution fonctionne bien:

sed 's/pattern.*$/&\n/'

Exemple :

$ printf "Hi\nBye\n" | sed 's/H.*$/&\nJohn/'
Hi
John
Bye

Pour être conforme aux normes, remplacez\n par une nouvelle barre oblique inversée:

$ printf "Hi\nBye\n" | sed 's/H.*$/&\
> John/'
Hi
John
Bye
2
Richard
sed '/pattern/a\\r' file name 

Il ajoutera un retour après le modèle tandis que g remplacera le modèle par une ligne vierge.

Si une nouvelle ligne (vide) doit être ajoutée à la fin du fichier, utilisez ceci:

sed '$a\\r' file name
2
nemo

Une autre possibilité, par exemple si vous n'avez pas de registre d'attente vide, cela pourrait être:

sed '/pattern/{p;s/.*//}' file

Explication:
/pattern/{...} = appliquer une séquence de commandes, si une ligne avec un motif est trouvée,
p = imprimer la ligne courante,
; = séparateur entre les commandes,
s/.*// = remplacer quoi que ce soit par rien dans le registre de modèle,
puis imprimez automatiquement le registre de modèle vide en tant que ligne supplémentaire)

0
Gerald Schade