Làm thế nào để chỉ thay thế các dòng phù hợp với một số mẫu trong sed?


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

Tôi biết tôi có thể khớp các dòng bắt đầu CHbằng ^CHnhưng làm thế nào tôi có thể khớp nhiều mẫu?

Thí dụ:

Đầu vào:

CH12
CH23au

Đầu ra:

CH12
<b>CH23au

Làm thế nào để chỉ đặt <b>nơi có ^CHvà autrong dòng?

Câu trả lời:


8

Nếu CHphải xảy ra ở đầu dòng, thứ tự CHvà auđược cố định, vì vậy bạn có thể tìm kiếm ^CH.*au.

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

Nếu thứ tự của hai mẫu không cố định, người ta có thể làm một cái gì đó như

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

nhưng giải pháp perl

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

có lẽ dễ đọc hơn


5

Cách tiếp cận khác:

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

b(nhánh đến cuối nếu không đưa ra bất kỳ đối số nhãn nào) giống như continuehoặc nexttrong các ngôn ngữ khác. Vì vậy, ở trên là như sau:

for (; line = readline(); print line) { # The implicit loop in sed
  if (!/^CH/) continue;
  if (!/au/) continue;
  line =~ s/^/<b>/
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.