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ó ^CHautrong dòng?

Câu trả lời:


8

Nếu CHphải xảy ra ở đầu dòng, thứ tự CHauđượ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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.