Làm cách nào tôi có thể sử dụng các công cụ xử lý văn bản để chèn một dòng mới sau mỗi N dòng?
Ví dụ cho N = 2:
ĐẦU VÀO:
sadf
asdf
yxcv
cxv
eqrt
asdf
ĐẦU RA:
sadf
asdf
yxcv
cxv
eqrt
asdf
Làm cách nào tôi có thể sử dụng các công cụ xử lý văn bản để chèn một dòng mới sau mỗi N dòng?
Ví dụ cho N = 2:
ĐẦU VÀO:
sadf
asdf
yxcv
cxv
eqrt
asdf
ĐẦU RA:
sadf
asdf
yxcv
cxv
eqrt
asdf
Câu trả lời:
Với awk
:
awk ' {print;} NR % 2 == 0 { print ""; }' inputfile
Với sed
( GNU
phần mở rộng):
sed '0~2 a\\' inputfile
Với bash
:
#!/bin/bash
lines=0
while IFS= read -r line
do
printf '%s\n' "${line}"
((lines++ % 2)) && echo
done < "$1"
sed '0~2 a\ '
sẽ thêm một khoảng trắng cho mỗi dòng mới được chèn. Nếu bạn muốn thêm một dòng mới sau mỗi dòng, bất kỳ những công việc tương tự: sed '0~1 a\ '
, sed 'a\ '
, hoặc chỉ sed G
.
sed n\;G <infile
... là tất cả những gì bạn cần ...
Ví dụ:
seq 6 | sed n\;G
1
2
3
4
5
6
... (và một khoảng trống cũng theo sau 6) ... hoặc ...
seq 5 | sed n\;G
1
2
3
4
5
(và không có khoảng trống nào sau 5)
Nếu một khoảng trống phải luôn được bỏ qua trong trường hợp dòng cuối cùng:
sed 'n;$!G' <infile
Một hương vị awk khác:
awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
Với (GNU) sed
:
sed '0~2G'
Ngắn (xấu cho N = 100):
sed 'n;G'
người đàn ông sed giải thích ~ như:
đầu tiên ~ bước
Ghép từng dòng của bước bắt đầu với dòng đầu tiên. Ví dụ, `` sed -n 1 ~ 2p '' sẽ in tất cả các dòng được đánh số lẻ trong luồng đầu vào và địa chỉ 2 ~ 5 sẽ khớp với mỗi dòng thứ năm, bắt đầu bằng dòng thứ hai. đầu tiên có thể bằng không; trong trường hợp này, sed hoạt động như thể nó bằng bước. (Đây là một phần mở rộng.)
Với sed khác (Đếm dòng mới):
sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'
Hoặc, để dễ di chuyển hơn, được viết dưới dạng (xóa nhận xét cho một số phiên bản của 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.
Với awk
, có lẽ:
awk '1 ; NR%2==0 {printf"\n"} '
[[ ]]
kiểm tra :while read line; do echo "$line"; ((lines++ % 2)) && echo; done
.