텍스트 파일의 특정 줄 끝에 누락된 따옴표를 추가하려고 합니다.
정규식 [^\"]$가 터미널 큰따옴표가 누락된 줄을 찾는 데 충분하다는 것을 알았으므로 역참조를 사용하여 다음 대체를 시도했습니다(솔직히 이전에는 사용한 적이 없습니다). "캡처 그룹" 주위에 괄호를 사용합니다. 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
.