Вставити новий рядок після кожного N рядка?


24

Як я можу використовувати інструменти для обробки тексту, щоб вставити новий рядок після кожного N рядка?

Приклад для N = 2:

ВХОД:

sadf
asdf
yxcv
cxv
eqrt
asdf

ВИХІД:

sadf
asdf

yxcv
cxv

eqrt
asdf

Відповіді:


28

З awk:

awk ' {print;} NR % 2 == 0 { print ""; }' inputfile

З sed( GNUрозширення):

sed '0~2 a\\' inputfile

З bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"

2
Арифметичні обчислення можна використовувати безпосередньо в якості умови, немає необхідності для [[ ]]випробування: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
манатура

1
Майте на увазі, що наведена вище документально підтверджена команда sed '0~2 a\ 'додає пробіл до кожного вставленого нового рядка. Якщо ви хочете додати новий рядок після кожного рядка, будь-який з цієї аналогічно роботи: sed '0~1 a\ ', sed 'a\ 'або просто sed G.
Acumenus


4
sed n\;G <infile

... це все, що вам потрібно ...

Наприклад:

seq 6 | sed n\;G

ВИХІД:

1
2

3
4

5
6

... (і пробіг також слід за 6) ... або ...

seq 5 | sed n\;G

ВИХІД:

1
2

3
4

5

(а проміжок не відповідає 5)

Якщо в останньому регістрі рядка завжди буде пропущено порожнє:

sed 'n;$!G' <infile


1

sed (GNU)

С (GNU) sed:

sed '0~2G'

Короткий (некрасивий для N = 100):

sed 'n;G'

man sed пояснює ~ як:

Перший ~ крок
Збіг кожного крокового рядка, починаючи з першого рядка. Наприклад, `` sed -n 1 ~ 2p '' буде друкувати всі непарні рядки у вхідному потоці, а адреса 2 ~ 5 буде відповідати кожному п'ятому рядку, починаючи з другого. перший може бути нульовим; в цьому випадку sed діє так, ніби він дорівнює кроку. (Це розширення.)

sed (інше)

За допомогою іншого sed (Порахуйте нові рядки):

sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'

Або, щоб бути більш портативним, написано як (видаліть коментарі до деяких версій sed):

sed -e '             # Start a sed script.
         p            # Whatever happens later, print the line.
         s/.*//       # Clean the pattern space.
         H            # Add **one** newline to hold space.
         x            # Get the hold space to examine it, now is empty.
         /\n\{2\}/{   # Test if there are 2 new lines counted.
             g        # Erase the newline count.
             p        # Print an additional new line.
           }          # End the test.
         x            # match the `x` done above.
         d            # don't print anything else. Re-start.
       '              # End sed script.

awk

З awk, можливо:

awk '1 ; NR%2==0 {printf"\n"} '
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.