![여러 패턴과 일치하는 sed의 줄만 바꾸는 방법은 무엇입니까?](https://linux55.com/image/32106/%EC%97%AC%EB%9F%AC%20%ED%8C%A8%ED%84%B4%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20sed%EC%9D%98%20%EC%A4%84%EB%A7%8C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au
CH
by 로 시작하는 행을 일치시킬 수 있다는 것을 알고 있지만 ^CH
여러 패턴을 어떻게 일치시킬 수 있습니까?
예:
입력하다:
CH12
CH23au
산출:
CH12
<b>CH23au
<b>
특정 위치 ^CH
와 행 에만 배치하는 방법은 무엇입니까 au
?
답변1
합계의 순서 는 고정되어 있으므로 CH
해당 줄의 시작 부분에 나타나야 하는 경우 찾을 수 있습니다 .CH
au
^CH.*au
$ echo -e 'CH12\nCH23au' | sed '/^CH.*au/s=^=<b>='
CH12
<b>CH23au
$
두 모드의 순서가 고정되어 있지 않으면 다음과 같이 할 수 있습니다.
sed -e '/pattern1/{;/pattern2/s/old/new/;}'
하지만 펄 솔루션은
perl -pe 'if (/pattern1/ && /pattern2/) {s/old/new/;}'
더 읽기 쉬울 수도 있습니다.
답변2
또 다른 방법:
sed -e '/^CH/!b' -e '/au/!b' -e 's/^/<b>/'
b
(레이블 인수가 주어지지 않으면 끝까지 분기됩니다.) continue
다른 언어와 유사하거나 다른 언어에서 사용됩니다. next
따라서 위의 내용은 다음과 같습니다.
for (; line = readline(); print line) { # The implicit loop in sed
if (!/^CH/) continue;
if (!/au/) continue;
line =~ s/^/<b>/
}