를 사용하여 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이 제거되고 #
, 그렇지 않으면 수정되지 않은 패턴 공간만 인쇄됩니다.#bar
foo
확실히/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'