Ce qui suit imprimera la ligne correspondant TERMINATE
jusqu'à la fin du fichier:
sed -n -e '/TERMINATE/,$p'
Expliqué: -n
désactive le comportement par défaut sed
de l'impression de chaque ligne après avoir exécuté son script dessus, a -e
indiqué un script à sed
, /TERMINATE/,$
est une sélection de plage d'adresses (ligne) signifiant la première ligne correspondant à l' TERMINATE
expression régulière (comme grep) à la fin du fichier ( $
) , et p
est la commande d'impression qui imprime la ligne courante.
Cela imprimera à partir de la ligne qui suit la ligne correspondant TERMINATE
jusqu'à la fin du fichier:
(d'Après la ligne correspondante à EOF, sans inclure la ligne correspondante)
sed -e '1,/TERMINATE/d'
Expliqué: 1,/TERMINATE/
est une sélection de plage d'adresses (ligne) signifiant la première ligne pour l'entrée de la 1ère ligne correspondant à l' TERMINATE
expression régulière, et d
est la commande de suppression qui supprime la ligne actuelle et passe à la ligne suivante. Le sed
comportement par défaut étant d'imprimer les lignes, il imprimera les lignes après TERMINATE
la fin de l'entrée.
Éditer:
Si vous voulez les lignes avant TERMINATE
:
sed -e '/TERMINATE/,$d'
Et si vous voulez les deux lignes avant et après TERMINATE
dans 2 fichiers différents en un seul passage:
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
Les fichiers avant et après contiendront la ligne avec terminate, donc pour traiter chacun d'entre eux, vous devez utiliser:
head -n -1 before
tail -n +2 after
Edit2:
SI vous ne souhaitez pas coder en dur les noms de fichiers dans le script sed, vous pouvez:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
Mais alors vous devez échapper à la $
signification de la dernière ligne pour que le shell n'essaie pas de développer la $w
variable (notez que nous utilisons maintenant des guillemets doubles autour du script au lieu de guillemets simples).
J'ai oublié de dire que la nouvelle ligne est importante après les noms de fichiers dans le script afin que sed sache que les noms de fichiers se terminent.
Edit: 2016-0530
Sébastien Clément a demandé: "Comment remplaceriez-vous le codé TERMINATE
en dur par une variable?"
Vous créeriez une variable pour le texte correspondant, puis vous le feriez de la même manière que dans l'exemple précédent:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
pour utiliser une variable pour le texte correspondant aux exemples précédents:
## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"
Les points importants sur le remplacement du texte par des variables dans ces cas sont:
- Les variables (
$variablename
) entre single quotes
[ '
] ne "se développeront" pas mais les variables à l'intérieur de double quotes
[ "
] le seront. Donc, vous devez changer tous les single quotes
en double quotes
s'ils contiennent du texte que vous souhaitez remplacer par une variable.
- Les
sed
gammes contiennent également $
et sont immédiatement suivies d'une lettre comme: $p
, $d
, $w
. Ils examineront également comme des variables à être étendu, donc vous devez échapper à ces $
personnages avec une barre oblique inverse [ \
] comme: \$p
, \$d
, \$w
.
grep 'TERMINATE' file