Bagaimana cara hanya mengganti garis yang cocok dengan beberapa pola dalam sed?

8
$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au

Aku tahu aku bisa mencocokkan baris yang dimulai dengan CHoleh ^CHtapi bagaimana saya bisa mencocokkan beberapa pola?

Contoh:

Memasukkan:

CH12
CH23au

Keluaran:

CH12
<b>CH23au

Bagaimana hanya menempatkan di <b>mana ada ^CHdan audalam barisan?

peter gasko
sumber

Jawaban:

8

Jika CHharus terjadi di awal baris, urutan CHdan audiperbaiki, sehingga Anda dapat mencari ^CH.*au.

$ echo -e 'CH12\nCH23au' | sed '/^CH.*au/s=^=<b>='
CH12
<b>CH23au
$

Jika urutan kedua pola tersebut tidak diperbaiki, orang dapat melakukan sesuatu seperti

sed -e '/pattern1/{;/pattern2/s/old/new/;}'

tetapi solusi perl

perl -pe 'if (/pattern1/ && /pattern2/) {s/old/new/;}'

mungkin lebih mudah dibaca.

Uwe
sumber
5

Pendekatan lain:

sed -e '/^CH/!b' -e '/au/!b' -e 's/^/<b>/'

b(bercabang sampai akhir jika tidak diberikan argumen label) seperti continueatau nextdalam bahasa lain. Jadi di atas seperti:

for (; line = readline(); print line) { # The implicit loop in sed
  if (!/^CH/) continue;
  if (!/au/) continue;
  line =~ s/^/<b>/
}
Stéphane Chazelas
sumber