Mempertimbangkan:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Ini akan cocok dengan baris 3, 4 dan 5.
Tetapi saya mencoba untuk mencocokkan hanya baris 3 dan 5 (bukan 4). Dan tambahkan 'tes' setelah mereka.
Mempertimbangkan:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Ini akan cocok dengan baris 3, 4 dan 5.
Tetapi saya mencoba untuk mencocokkan hanya baris 3 dan 5 (bukan 4). Dan tambahkan 'tes' setelah mereka.
Jawaban:
echo ... | sed -e '3a test' -e '5a test'
Jika operasi lebih kompleks daripada dalam hal ini maka Anda dapat menggunakan struktur seperti ini:
sed 'b pattern; : action; a \
lalala
b end; : pattern; 3b action; 5b action; : end'
Yaitu Anda meletakkan semua perintah yang Anda butuhkan antara b pattern;dan b end;.
Dan Anda menambahkan semua pola Anda (nomor baris atau apa pun) setelahnya : pattern;.
Yang terjadi adalah ini:
Perintah pertama melompati bagian aksi (mungkin lebih mudah untuk membaca jika polanya ada di awal dan b end;langsung sebelum bagian aksi).
Jika suatu pola cocok maka eksekusi melompat ke bagian tindakan. Setelah aksi, bagian eksekusi melompat ke akhir.
Saya mencoba merapikan ini:
sed '3b action; 5b action; b end; : action; a \
lalala
: end'
Dalam satu baris akan seperti:
sed "3b idAction; 5b idAction; b; : idAction; a test"
Portable, Anda perlu menulisnya:
sed '
3b action
5b action
b
: action
a\
lalala'
( btanpa cabang label sampai akhir, jadi Anda tidak perlu endlabel eksplisit , ;adalah karakter yang valid dalam label dalam sedimplementasi standar ).
Dengan sed(lihat jawaban @ HaukeLaging )
Dengan awk:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | awk 'NR==3 || NR==5{$0=$0"\ntest"}1;'
Dengan perl:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | perl -pe '$_ .="test\n" if $. == 3 || $. == 5'
perl -lnE 'say if $. ~~ @{[3,5]}'
~~, tidak memahaminya sebaik yang seharusnya. Juga, keduanya saydan ~~perlu perl v> = 5.10 kan?
perl -pE 'say "test" if $. ~~ @{[4,6]}'- ini menambahkan baris: perl's -pmelakukan pencetakan implisit di akhir program yang diberikan.
Seperti yang dikatakan @HaukeLaging aleady, perintah ini melakukan apa yang Anda inginkan:
sed -e'3a test' -e'5a test'
Sekarang, ini bisa menjadi agak sulit untuk diketik jika Anda ingin mencocokkan, misalnya, 20 baris.
Dalam kasus ini, dengan asumsi shell Anda mendukung ekspansi brace , Anda dapat menggunakan perintah ini sebagai gantinya:
sed -e{3,5}'a test'
(Perhatikan bahwa kurung kurawal dan koma harus tetap tanda kutip.)
Akibatnya, shell akan meneruskan argumen ke -e3a testdan -e5a testke sed, yang persis seperti yang dilakukan perintah pertama.