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'
( b
tanpa cabang label sampai akhir, jadi Anda tidak perlu end
label eksplisit , ;
adalah karakter yang valid dalam label dalam sed
implementasi 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 say
dan ~~
perlu perl v> = 5.10 kan?
perl -pE 'say "test" if $. ~~ @{[4,6]}'
- ini menambahkan baris: perl's -p
melakukan 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 test
dan -e5a test
ke sed, yang persis seperti yang dilakukan perintah pertama.