이런 종류의 행이 많이 포함된 텍스트 파일이 있습니다.
/*[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@/\*[^*]*\*/@@;'