Как я могу использовать инструменты обработки текста для вставки новой строки после каждых N строк?
Пример для N = 2:
ВХОД:
sadf
asdf
yxcv
cxv
eqrt
asdf
ВЫХОД:
sadf
asdf
yxcv
cxv
eqrt
asdf
Как я могу использовать инструменты обработки текста для вставки новой строки после каждых N строк?
Пример для N = 2:
ВХОД:
sadf
asdf
yxcv
cxv
eqrt
asdf
ВЫХОД:
sadf
asdf
yxcv
cxv
eqrt
asdf
Ответы:
С 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"
sed '0~2 a\ '
добавляет пробел к каждой вставленной новой строке. Если вы хотите добавить новую строку после каждой строки, любой из этой аналогично работы: sed '0~1 a\ '
, sed 'a\ '
или просто sed G
.
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
Еще один приятный вкус:
awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
С (GNU) sed
:
sed '0~2G'
Короткий (некрасиво для N = 100):
sed 'n;G'
Человек Сед объясняет ~ как:
первый шаг Шаг
соответствует каждой строке шага, начиная с первой строки. Например, `` sed -n 1 ~ 2p '' напечатает все нечетные строки во входном потоке, а адрес 2 ~ 5 будет совпадать с каждой пятой строкой, начиная со второй. первым может быть ноль; в этом случае 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 '1 ; NR%2==0 {printf"\n"} '
[[ ]]
испытанию:while read line; do echo "$line"; ((lines++ % 2)) && echo; done
.