Hé, j'ai besoin de fusionner trois lignes consécutives avec un échange entre la 2ème et la 3ème ligne dans "fichier":
$cat file
Object Name: A
comments: comment A
manual_encdomain: Name: A
Object Name: B
comments: comment B
manual_encdomain: Name: B
Donc au lieu de sortir ci-dessous :
$sed 'N;N;s/n/ /g' file
Object Name: A comments: comment A manual_encdomain: Name: A
Object Name: B comments: comment B manual_encdomain: Name: B
J'aurais plutôt besoin de ça
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
sed, awk n'importe quoi
Réponse acceptée :
Oui, vous pouvez utiliser sed pour échanger des lignes :
$ sed -E 'N;N;s/n([^n]*)n([^n]*)/ 2 1/' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
Ou, de façon équivalente :
$ sed 'N;N;s/n([^n]*)n([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
Comment ça marche :
-
-E
Cela active les expressions régulières étendues. (
-E
fonctionne à la fois sur BSD (OSX) sed et GNU sed moderne. Pour les anciennes versions de GNU sed, utilisez-r
à la place.)Sans regex étendu, nous devons échapper
(
et)
comme indiqué ci-dessus. -
N;N
Cela se lit dans les deuxième et troisième lignes.
-
s/n([^n]*)n([^n]*)/ 2 1/
Cela échange les deuxième et troisième lignes. La première occurrence de
n([^n]*)
capture la deuxième ligne et l'enregistre dans le groupe de capture 1. La deuxième occurrence den([^n]*)
capture la troisième ligne et l'enregistre dans le groupe de capture 2. Le texte de remplacement,2 1
échange la position tout en remplaçant les retours à la ligne par des espaces.
Suppression des espaces blancs en excès
Les deuxième et troisième lignes sont indentées dans le fichier d'entrée. Si nous voulons supprimer cet espace blanc supplémentaire :
$ sed -E 'N;N;s/n[[:blank:]]*([^n]*)n[[:blank:]]*([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
[[:blank:]]
est le moyen sécurisé Unicode de faire correspondre les blancs et les tabulations.