Xem xét:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Điều này sẽ phù hợp với dòng 3, 4 và 5.
Nhưng tôi đang cố gắng chỉ khớp dòng 3 và 5 (không phải 4). Và nối 'kiểm tra' sau chúng.
Xem xét:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Điều này sẽ phù hợp với dòng 3, 4 và 5.
Nhưng tôi đang cố gắng chỉ khớp dòng 3 và 5 (không phải 4). Và nối 'kiểm tra' sau chúng.
Câu trả lời:
echo ... | sed -e '3a test' -e '5a test'
Nếu thao tác phức tạp hơn trong trường hợp này thì bạn có thể sử dụng cấu trúc như thế này:
sed 'b pattern; : action; a \
lalala
b end; : pattern; 3b action; 5b action; : end'
Tức là bạn đặt tất cả các lệnh bạn cần giữa b pattern;
và b end;
.
Và bạn thêm tất cả các mẫu của bạn (số dòng hoặc bất cứ điều gì) sau : pattern;
.
Điều gì xảy ra là thế này:
Lệnh đầu tiên nhảy qua phần hành động (có thể dễ đọc hơn nếu các mẫu ở đầu và b end;
trực tiếp trước phần hành động).
Nếu một mẫu phù hợp thì thực thi nhảy đến phần hành động. Sau khi thực hiện phần hành động nhảy đến cuối.
Tôi cố gắng dọn dẹp cái này:
sed '3b action; 5b action; b end; : action; a \
lalala
: end'
Trong một dòng duy nhất sẽ như sau:
sed "3b idAction; 5b idAction; b; : idAction; a test"
Có thể, bạn cần phải viết nó:
sed '
3b action
5b action
b
: action
a\
lalala'
( b
không có các nhánh nhãn đến cuối, vì vậy bạn không cần một end
nhãn rõ ràng , ;
là một ký tự trong nhãn trong các sed
triển khai tiêu chuẩn ).
Với sed
(xem câu trả lời của @ HaukeLaging )
Với awk
:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | awk 'NR==3 || NR==5{$0=$0"\ntest"}1;'
Với perl
:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | perl -pe '$_ .="test\n" if $. == 3 || $. == 5'
perl -lnE 'say if $. ~~ @{[3,5]}'
~~
, không hiểu nó cũng như tôi nên làm. Ngoài ra, cả say
và ~~
cần perl v> = 5.10 phải không?
perl -pE 'say "test" if $. ~~ @{[4,6]}'
- đây prepends dòng: perl của -p
hiện một in ngầm tại cuối của chương trình nhất định.
Như @HaukeLaging aleady đã nói, lệnh này thực hiện những gì bạn muốn:
sed -e'3a test' -e'5a test'
Bây giờ, điều này có thể trở nên khá cồng kềnh để gõ nếu bạn muốn khớp, ví dụ: 20 dòng.
Trong những trường hợp này, giả sử shell của bạn hỗ trợ mở rộng dấu ngoặc , bạn có thể sử dụng lệnh này thay thế:
sed -e{3,5}'a test'
(Lưu ý rằng dấu ngoặc nhọn và dấu phẩy phải không được trích dẫn.)
Kết quả là, shell sẽ truyền các đối số tới -e3a test
và -e5a test
sed, đó chính xác là những gì lệnh đầu tiên làm.