sed에서 따옴표 안에 표시되지 않는 한 #xxx 주석을 제거하세요.

sed에서 따옴표 안에 표시되지 않는 한 #xxx 주석을 제거하세요.

다음 문제를 해결하는 방법은 무엇입니까? 입력하다

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또는 시퀀스 대신 선택적으로 앞에 오는 시퀀스를 사용합니다.bba

답변2

간단한 대답은 다음과 같습니다.

sed 's/#[^#]*$//g'

줄이 끝날 때까지 #하나 이상의 "not " 문자가 뒤에 오는 것과 일치합니다 . #좀 더 복잡한 것을 추구한다면 정확히 무엇을 추구하는지 조금 더 확장해 볼 가치가 있습니다.

관련 정보