回答:
で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。
別のawkフレーバー:
awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
(GNU)を使用sed:
sed '0~2G'
短い(N = 100の場合はugい):
sed 'n;G'
man sedは次のように説明しています:
first〜step line firstで始まるすべてのステップの行に一致します。たとえば、「sed -n 1〜2p」は入力ストリームのすべての奇数行を印刷し、アドレス2〜5は2行目から5行ごとに一致します。最初はゼロにすることができます。この場合、sedはstepと同等であるかのように動作します。(これは拡張機能です。)
他の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。