GNU/Linux >> Znalost Linux >  >> Linux

Sloučit 3 po sobě jdoucí řádky s výměnou?

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ýskyt n([^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.


Linux
  1. Vložit nové řádky s chybějícími hodnotami (ne)?

  2. Najděte všechny soubory s názvem obsahujícím řetězec

  3. `npm install` končí s Killed

  1. Sloučení složek s Mv?

  2. Nahradit rozsah řádků rozsahem řádků (sed nebo jiné)?

  3. Linux mv soubor s dlouhým názvem

  1. Používáte zalamování slov s Mc?

  2. Problém s výměnou v Ubuntu 18.04?

  3. Nainstalujte phpList pomocí Softaculous