GNU/Linux >> Znalost Linux >  >> Linux

Jak použít sed k odstranění pouze dvojitých prázdných řádků?

Okomentoval jsem sed příkaz, kterému nerozumíte:

sed '
    ## In first line: append second line with a newline character between them.
    1N;
    ## Do the same with third line.
    N;
    ## When found three consecutive blank lines, delete them. 
    ## Here there are two newlines but you have to count one more deleted with last "D" command.
    /^\n\n$/d;
    ## The combo "P+D+N" simulates a FIFO, "P+D" prints and deletes from one side while "N" appends
    ## a line from the other side.
    P;
    D
'

Odebrat 1N protože potřebujeme pouze dva řádky v 'zásobníku' a stačí s druhým N a změňte /^\n\n$/d;/^\n$/d; vymažete všechny dva po sobě jdoucí prázdné řádky.

Test:

Obsah infile :

1


2
3

4



5

6


7

Spusťte sed příkaz:

sed '
    N;
    /^\n$/d;
    P;
    D
' infile

To dává:

1
2
3

4

5

6
7

S awk by to bylo jednodušší :

awk -v RS='\n\n\n' 1

S cat by to bylo jednodušší :

cat -s

sed '/^$/{N;/^\n$/d;}'

Vymaže pouze dva po sobě jdoucí prázdné řádky v souboru. Tento výraz můžete použít pouze v souboru, pak tomu plně rozumíte pouze vy. Když přijde prázdný řádek, vstoupí do složených závorek.

Normálně sed přečte jeden řádek. N přidá druhý řádek do prostoru vzoru. Pokud je tento řádek prázdný. oba řádky jsou odděleny novým řádkem.

/^\n$/ tento vzor bude v tu dobu odpovídat pouze d bude pracovat. Jinak d nefunguje. d se používá k odstranění celého obsahu vzorového prostoru a poté ke spuštění dalšího cyklu.


Linux
  1. Naučte se používat textový editor Sed

  2. Jak použít Sed k výměně víceřádkového řetězce?

  3. Jak pomocí příkazu Linux „cat“ zobrazit pouze určité řádky podle čísla?

  1. Odstranit řádek obsahující určitý řetězec a následující řádek?

  2. sed - vložit řádek za X řádků po shodě

  3. jak odstranit dvojité uvozovky v csv

  1. Jak používat příkaz sed pro Linux

  2. Jak používat Awk k tisku pouze řádků obsahujících 5 sloupců?

  3. vložit pouze na první zápas