sed를 사용하여 패턴 뒤의 다음 줄을 편집하는 방법은 무엇입니까?

sed를 사용하여 패턴 뒤의 다음 줄을 편집하는 방법은 무엇입니까?

를 사용하여 sed로 끝나는 줄을 검색 foo한 후 로 시작하는 다음 줄을 편집하려면 어떻게 해야 합니까 #bar?

즉, #다음 줄이 로 시작하고 이전 줄이 로 끝나는 경우 #bar다음 줄의 주석을 제거하고 싶습니다 .foo

예를 들어:

This is a line ending in foo
#bar is commented out
There are many lines ending in foo
#bar commented out again

나는 시도했다:

sed -i 's/^foo\n#bar/foo\nbar/' infile

답변1

sed '/foo$/{n;s/^#bar/bar/;}'

귀하의 요청을 문자 그대로 번역한 것입니다. n입니다 next.

이제 다음과 같은 경우에는 작동하지 않습니다.

line1 foo
#bar line2 foo
#bar

또는:

line1 foo
line2 foo
#bar

n패턴 공간에 끌어온 선은 검색되지 않기 때문입니다 foo.

다음 줄을 패턴 공간으로 가져온 후 처음으로 다시 반복하여 이 문제를 해결할 수 있습니다.

sed '
  :1
  /foo$/ {
     n
     s/^#bar/bar/
     b1
  }'

답변2

사용N;P;D반복하고 각 대체를 시도합니다.

sed '$!N;s/\(foo\n\)#\(bar\)/\1\2/;P;D' infile

로 끝나는 줄 뒤에 오는 경우에만 선행 from이 제거되고 #, 그렇지 않으면 수정되지 않은 패턴 공간만 인쇄됩니다.#barfoo


확실히/etc/pacman.d/mirrorlist, 완전히 다른 미국 미러의 주석 처리를 제거하려고 합니다 .

sed -e '/United States/,/^$/{//!s/^#//' -e '}' /etc/pacman.d/mirrorlist

이렇게 하면 US 섹션의 모든 미러 주석이 제거됩니다./etc/pacman.d/mirrorlist

답변3

노력하다:

sed -e '$!N;/foo\n#bar/s/\(\n\)#/\1/;P;D'

관련 정보