![sed에서 따옴표 안에 표시되지 않는 한 #xxx 주석을 제거하세요.](https://linux55.com/image/5168/sed%EC%97%90%EC%84%9C%20%EB%94%B0%EC%98%B4%ED%91%9C%20%EC%95%88%EC%97%90%20%ED%91%9C%EC%8B%9C%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%ED%95%9C%20%23xxx%20%EC%A3%BC%EC%84%9D%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EC%84%B8%EC%9A%94..png)
다음 문제를 해결하는 방법은 무엇입니까? 입력하다
hai this is "#test" #this is comment
질문: 쉘 스크립트에서 주석만 제거하는 방법. 예상 출력:
hai this is "#test"
답변1
GNU 또는 FreeBSD 사용 sed
:
$ sed -E 's/^(([^"#]|"(\\.|[^\\"])*")*)#.*/\1/' << EOF
heredoc> hi this is "#test" #this is comment
heredoc> this is test # comment with # characters
heredoc> hi this is "\"test" #this is comment as " was escaped earlier
heredoc> EOF
hi this is "#test"
this is test
hi this is "\"test"
아이디어는 #.*
다음과 같은 시퀀스를 일치시키는 것입니다.
"
또는#
( )[^"#"]
이외의 문자- 또는
"..."
따옴표 붙은 문자열입니다....
여기서 는 다음 시퀀스 중 하나입니다.\x
: 백슬래시 뒤에 임의의 문자(\\.
) 가 옵니다."
또는 또는 이외의 문자입니다\
.
POSIXly(아니요번갈아( |
) 운영자(하지만)) 다음과 같이 작성할 수 있습니다.
sed 's/^\(\(\("\(\(\\.\)\{0,1\}[^\"]\)*"\)\{0,1\}[^"#]\)*\)#.*/\1/'
(a|b)*
여기서는 ERE 대신 BRE를 사용합니다 \(a\{0,1\}b\)*
. 즉, a
또는 시퀀스 대신 선택적으로 앞에 오는 시퀀스를 사용합니다.b
b
a
답변2
간단한 대답은 다음과 같습니다.
sed 's/#[^#]*$//g'
줄이 끝날 때까지 #
하나 이상의 "not " 문자가 뒤에 오는 것과 일치합니다 . #
좀 더 복잡한 것을 추구한다면 정확히 무엇을 추구하는지 조금 더 확장해 볼 가치가 있습니다.