Tout bien considéré, engloutir le fichier entier peut être le moyen le plus rapide.
La syntaxe de base est la suivante:
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
Attention, engloutir le fichier entier peut ne pas être une option si le fichier est extrêmement volumineux. Dans de tels cas, les autres réponses fournies ici proposent des solutions personnalisées dont l’efficacité est garantie pour un faible encombrement de la mémoire.
Pour toutes les autres situations de hack et de slash, le fait d’ajouter des préfixes, -e '1h;2,$H;$!d;g'
suivi de votre sed
argument regex original, permet de faire le travail.
par exemple
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
Que fait -e '1h;2,$H;$!d;g'
-il?
Le 1
, 2,$
, les $!
parties sont en ligne spécificateurs qui limite les lignes de la commande suivante directement exécuté.
1
: Première ligne seulement
2,$
: Toutes les lignes à partir de la seconde
$!
: Chaque ligne autre que dernière
Tellement développé, c’est ce qui se passe sur chaque ligne d’une entrée de N ligne.
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
La g
commande n'est pas donné une spécificateur de ligne, mais la précédente d
commande a une clause spéciale « Début du prochain cycle. », Et cela empêche g
de fonctionner sur toutes les lignes sauf la dernière.
Quant à la signification de chaque commande:
- Le premier
h
suivi de H
s sur chaque ligne copie lesdites lignes d'entrée dans sed
l' espace d'attente de . (Pensez à un tampon de texte arbitraire.)
- Ensuite,
d
élimine chaque ligne pour empêcher l’écriture de ces lignes dans la sortie. L' espace d'attente est toutefois préservé.
- Enfin, à la toute dernière ligne,
g
restaure l’accumulation de chaque ligne de l’ espace de réservation de manière à sed
pouvoir exécuter sa regex sur l’entrée entière (plutôt que ligne à la fois), et par conséquent correspondre à \n
s.