ฉันจะใช้เครื่องมือประมวลผลข้อความเพื่อแทรกบรรทัดใหม่หลังจากทุกบรรทัด N ได้อย่างไร
ตัวอย่างสำหรับ N = 2:
INPUT:
sadf
asdf
yxcv
cxv
eqrt
asdf
เอาท์พุท:
sadf
asdf
yxcv
cxv
eqrt
asdf
ฉันจะใช้เครื่องมือประมวลผลข้อความเพื่อแทรกบรรทัดใหม่หลังจากทุกบรรทัด N ได้อย่างไร
ตัวอย่างสำหรับ N = 2:
INPUT:
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
การใช้ paste
paste -d'\n' - - /dev/null <file
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:
awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
ด้วย (GNU) sed
:
sed '0~2G'
สั้น (น่าเกลียดสำหรับ N = 100):
sed 'n;G'
คน sed อธิบาย ~ เป็น:
~ ขั้นตอนแรก
จับคู่ทุกบรรทัดบรรทัดที่เริ่มต้นด้วยบรรทัดแรก ตัวอย่างเช่น `` sed -n 1 ~ 2p '' จะพิมพ์บรรทัดเลขคี่ทั้งหมดในอินพุตสตรีมและที่อยู่ 2 ~ 5 จะจับคู่ทุกบรรทัดที่ห้าเริ่มต้นด้วยบรรทัดที่สอง แรกสามารถเป็นศูนย์ ในกรณีนี้ sed ทำงานราวกับว่ามันเท่ากับขั้นตอน (นี่คือส่วนขยาย)
ด้วย sed อื่น ๆ (นับบรรทัดใหม่):
sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'
หรือจะพกพาได้มากกว่าเขียนเป็น (ลบความคิดเห็นสำหรับรุ่นบางรุ่น):
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