sed를 사용하여 문자열에서 특정 텍스트 항목만 제거

sed를 사용하여 문자열에서 특정 텍스트 항목만 제거

이런 종류의 행이 많이 포함된 텍스트 파일이 있습니다.

/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36'; 

sed댓글을 삭제할 수 있는 방법이 있나요?오직, 즉 a로 시작 하고 ? /*로 끝나는 모든 항목이 해당됩니다. */이렇게 하면 라인이 다음과 같이 됩니다.

UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';

나는 무언가로 시작하는 전체 줄을 제거하는 데 사용하는 방법을 알고 있습니다 sed. SQL이 포함된 텍스트 파일의 예에서는 해시 기호일 가능성이 높습니다 #.

답변1

sed어떤 방식으로든 일치하기 때문에 greedy이전의 실제 주석 끝 표시 대신 주석 끝 이후의 텍스트가 일치할 가능성이 항상 있습니다. "*/"를 포함하는 따옴표 붙은 문자열과 같습니다.
이 문제는 간단한 방법으로 처리할 수 없지만 sed해결할 수는 있습니다. 다음은 그러한 방법 중 하나입니다. 두 문자 끝 구분 기호에 단일 문자 자리 표시자를 사용하는 것입니다. 16진수 값을 \x01대체 문자로 사용하는 것은 일반 텍스트에 존재하지 않으므로 안전합니다(즉, 기존 텍스트와 충돌하지 않습니다).

sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"

perl, 반면에 선택적으로 lazy일치(및 훨씬 더 많은 것)를 처리할 수 있습니다. 이미 언급했듯이존 웨슬리 왕자댓글에 있는 내용은 다음과 같습니다.게으른 perl동등한.

perl -ple 's|/\*.*?\*/||g' "$file"

답변2

이거 한번 해봐:

sed 's@/\*[^/]*\*/@@'

아쉽게도 내부의 코멘트에는 어려움이 있을 수 있습니다 /.

두 가지 변형을 함께 사용하면 유용할 수 있습니다. 모든 주석이 완전히 제거되었는지 확인하는 것입니다.

sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'

관련 정보