주석이 옵션으로 시작하고 그 뒤에 한 줄 이상의 주석이 오는 파일의 특정 줄의 주석 처리를 제거하려고 합니다. 다음은 처리하려는 파일의 최소 예입니다( example.txt
).
# Ignore this one
# first-option)
# something-something x \
# run-something-else y \
# run-after-this z \
# set-some-config-var 10 10
# Uncomment this one
# second-option)
# something x \
# run-something-else y \
# run-something-else-again z \
# run-after-this-something z \
# set-some-config-var 10 10 \
# set-some-config-var cool
그리고 나의 순진한 해결책( test.sed
), 먼저 필요한 패턴을 찾은 다음 반복 교체를 적용합니다.
#!/usr/bin/env sed
/#.*second-option/{
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
}
산출:
$ sed -n -f test.sed example.txt
second-option)
something x \
run-something-else y \
run-something-else-again z \
run-after-this-something z \
set-some-config-var 10 10 \
set-some-config-var cool
모든 옵션에 대해 잘 알지는 못하지만 sed
좀 더 일반적인 접근 방식(또는 더 쉬운 방법)이 있는지 궁금합니다.
답변1
나는 사용할 것이다주소 범위. 빈 줄이 보이면 시작 second-option
하고 빈 줄이 보이면 끝나기를 원합니다.
#!/bin/sed -f
/^#.*second-option/,/^#? *$/s/^# //
# from | to | substitute
답변2
$ sed -e '
/^#[[:blank:]]*second-option[)]$/!b
:a;$!N;s/\\$/&/;ta
s/\(\n\)#/\1/g;s/^#//
' file
bash
명령줄 에서Posix sed
또는 Gnu sed를 사용하여 다음을 수행하세요.
$ sed -e '/^#\s*second-option[)]$/,/[^\]$/s/^#//' file