다음과 같은 많은 줄이 포함된 텍스트 파일이 있습니다.
/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';
sed
댓글 삭제 하는 방법 없나요오직/*
, 이는 a로 시작하고 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@/\*[^*]*\*/@@;'