แทรกบรรทัดใหม่หลังจากทุกบรรทัด N หรือไม่?


24

ฉันจะใช้เครื่องมือประมวลผลข้อความเพื่อแทรกบรรทัดใหม่หลังจากทุกบรรทัด N ได้อย่างไร

ตัวอย่างสำหรับ N = 2:

INPUT:

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'

คน sed อธิบาย ~ เป็น:

~ ขั้นตอนแรก
จับคู่ทุกบรรทัดบรรทัดที่เริ่มต้นด้วยบรรทัดแรก ตัวอย่างเช่น `` sed -n 1 ~ 2p '' จะพิมพ์บรรทัดเลขคี่ทั้งหมดในอินพุตสตรีมและที่อยู่ 2 ~ 5 จะจับคู่ทุกบรรทัดที่ห้าเริ่มต้นด้วยบรรทัดที่สอง แรกสามารถเป็นศูนย์ ในกรณีนี้ sed ทำงานราวกับว่ามันเท่ากับขั้นตอน (นี่คือส่วนขยาย)

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อาจ:

awk '1 ; NR%2==0 {printf"\n"} '
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.