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

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

다음과 같은 많은 줄이 포함된 텍스트 파일이 있습니다.

/*[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@/\*[^*]*\*/@@;'

관련 정보