누락된 따옴표를 추가하는 정규식

누락된 따옴표를 추가하는 정규식

텍스트 파일의 특정 줄 끝에 누락된 따옴표를 추가하려고 합니다.

정규식 [^\"]$가 터미널 큰따옴표가 누락된 줄을 찾는 데 충분하다는 것을 알았으므로 역참조를 사용하여 다음 대체를 시도했습니다(솔직히 이전에는 사용한 적이 없습니다). "캡처 그룹" 주위에 괄호를 사용합니다. sed를 원합니다. 그룹 역참조를 허용하지만

sed  's|([^\"]$)|\1\"|g' bigfile.tsv

클릭수

sed: -e expression #1, char 17: invalid reference \1 on `s' command's RHS

대체 따옴표를 피하지 않으면 동일합니다.

sed  's|([^\"]$)|\1"|g' bigfile.tsv

(이제 문자 16은 공격적입니다.) 역참조는 어떻게 작동하나요? https://xkcd.com/1171/

답변1

sed없이 실행하는 경우 -E표현식은 기본 정규식이며 캡처링 그룹은 로 작성되어야 합니다 . 확장 정규식을 활성화하여 \(...\)실행하면 캡처링 그룹이 작성됩니다 .-E(...)

내부는 리터럴이므로 표현식은 로 \끝나는 [...]줄에 큰따옴표를 추가하지 않아도 됩니다 \. 다른 탈출도 필요하지 않습니다.

따라서 sed다음과 같이 명령을 작성할 수 있습니다.

sed 's/\([^"]\)$/\1"/'

또는

sed -E 's/([^"])$/\1"/'

또는 다음을 사용하십시오 &.

sed 's/[^"]$/&"/'

표현식의 대체 부분은 &정규식과 일치하는 입력 부분으로 대체됩니다.

캡처 그룹을 사용하지 않는 다른 대안:

sed '/[^"]$/ s/$/"/'

이는 s/$/"/일치하는 모든 행에 적용됩니다 /[^"]$/.

또는,

sed '/"$/ !s/$/"/'

이는 s/$/"/일치하지 않는 모든 행 에 대해 작동합니다( 빈 행에도 추가한다는 /"$/점에서 여기의 다른 방법과 약간 다릅니다 )."

g모든 경우에 끝에 있는 플래그는 다음과 같습니다 .정말불필요한.

답변2

노력하다 sed -e 's|\([^\"]$\)|\1\"|g' bigfile.tsv.

관련 정보