sed를 사용하여 정확한 단어를 바꾸고 싶습니다

sed를 사용하여 정확한 단어를 바꾸고 싶습니다

"내 목표는 파일에 다음 단어가 나타날 때 큰따옴표를 추가하는 것입니다.

VGHIER_TSV_WB798
CBVGHIER_TSV_WB798

여기

sed -i 's/"VGHIER_TSV_WB798"./VGHIER_TSV_WB798./g'

큰따옴표가 있는 경우 제거하는 데 사용됩니다.

sed -i 's/VGHIER_TSV_WB798./"VGHIER_TSV_WB798"./g'

인용문을 추가했는데, 인용문을 받았을 때 문제 CBVGHIER_TSV_WB798는 로 바뀌었다는 것입니다 CB"VGHIER_TSV_WB798". 두 번째 단어를 대체하기 위해 별도의 sed 문을 사용하고 싶지 않습니다.

sed -i 's/CBVGHIER_TSV_WB798./"CBVGHIER_TSV_WB798"./g'

위의 요구 사항을 달성하는 방법을 도와주실 수 있나요?

답변1

ERE를 지원하는 경우 일치하는 패턴의 선택적 부분으로 sed추가할 수 있습니다 . CB이는 다음 두 가지를 모두 대체합니다.

sed -E 's/(CB)?VGHIER_etc/"\1VGHIER_etc"/g'  test

또는 단어의 시작과 끝으로 and를 sed지원하는 경우 다음을 사용하세요.\<\>

sed 's/\<VGHIER_etc\>/"VGHIER_etc"/g'  test

또한 패턴에 후행 점이 있으면 .모든 문자와 일치하며 문자열의 일부로 대체됩니다. 교체된 포인트는 원래 포인트로 되돌아갑니다. 로 s/foo./"foo"./변경food"foo".

답변2

검색 문자열에 선행 접두사를 추가하고 싶다고 생각합니다. 바꾸려는 단어 앞에 항상 공백이 있는 경우:

sed -i 's/ VGHIER_TSV_WB798\./ "VGHIER_TSV_WB798"./g'

보다 일반적으로는 정규식 그룹화를 사용하여 [[:space:]]선행 공백이나 탭 등의 경우를 처리할 수 있습니다( man isspace전체 목록은 참고자료 참조).

sed -i 's/\([[:space:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

이 경우 이스케이프된 괄호를 사용하여 정규식 그룹화를 생성하고 다음을 사용하여 복잡성을 추가해야 합니다.역참조 \1대체를 수행할 때 정확한 문자가 손실되지 않도록 합니다. [[:punct:]]구두점 중 하나가 때때로 단어 앞에 나타날 경우를 대비하여 구두점에 대한 정규식 클래스 도 있습니다 . man isspace각 정규식 문자 클래스에서 다루는 전체 세부 목록은 참고자료를 참조하세요 .

가능한 구두점 접두사의 경우를 다루는 더 복잡한 예제 솔루션은 다음과 같습니다.

sed -i 's/\([[:space:]]\|[[:punct:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

이는 대안을 표시하기 위해 정규식 지시문 |(백슬래시로 이스케이프 처리됨 sed)을 활용합니다.

마지막으로 ^정규식을 사용하여 해당 단어가 항상 줄의 첫 번째 항목인지 요구합니다.

sed -i 's/^VGHIER_TSV_WB798\./"VGHIER_TSV_WB798"./g'

예, 위의 경우 문자열을 "그룹화"하고 "역참조"할 수 있습니다.

sed -i 's/^\(VGHIER_TSV_WB798\)\./"\1"./g'
sed -i 's/\([[:space:]]\|[[:punct:]]\)\(VGHIER_TSV_WB798\)\./\1"\2"./g'

관련 정보