Ahoj, potřebuji sloučit tři po sobě jdoucí řádky s prohozením mezi 2. a 3. řádkem v ‚souboru‘:
$cat file
Object Name: A
comments: comment A
manual_encdomain: Name: A
Object Name: B
comments: comment B
manual_encdomain: Name: B
Takže místo výstupu níže:
$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
Spíš bych potřeboval tohle
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
sed, awk cokoliv
Přijatá odpověď:
Ano, můžete použít sed k výměně řádků:
$ 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
Nebo ekvivalentně:
$ 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
Jak to funguje:
-
-E
Tím zapnete rozšířené regulární výrazy. (
-E
funguje jak na BSD (OSX) sedu, tak na moderním GNU sedu. Pro starší verze GNU sed použijte-r
místo toho.)Bez rozšířeného regulárního výrazu musíme escapovat
(
a)
jak je uvedeno výše. -
N;N
To je na druhém a třetím řádku.
-
s/n([^n]*)n([^n]*)/ 2 1/
Tím se prohodí druhý a třetí řádek. První výskyt
n([^n]*)
zachytí druhý řádek a uloží jej do skupiny zachycení 1. Druhý výskytn([^n]*)
zachytí třetí řádek a uloží jej do skupiny zachycení 2. Náhradní text,2 1
zamění pozici a nahradí nové řádky mezerami.
Odstranění přebytečných bílých míst
Druhý a třetí řádek jsou ve vstupním souboru odsazeny. Pokud chceme odstranit tyto mezery navíc:
$ 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:]]
je způsob, jak spárovat mezery a tabulátory, bezpečný pro Unicode.