큰따옴표 안의 큰따옴표를 제거하는 방법

큰따옴표 안의 큰따옴표를 제거하는 방법

이런 데이터가 있어요

"Apple grape","Banana"orange","Red green"
"Apple grape","Bananaorange","Red green"

"or를 사용하여 명령 사이에 있는 작은따옴표를 제거하고 싶습니다 .Bananaorangeawksed

답변1

sed 's/\([^,]\)"\([^,]\)/\1\2/g' file

이렇게 하면 쉼표가 아닌 ( ), 큰따옴표 및 쉼표가 아닌 시퀀스의 겹치지 않는 모든 시퀀스가 [^,]​​큰따옴표 없이 동일한 내용으로 대체됩니다.

...""...이는 및 와 같이 겹치는 하위 문자열에서 패턴이 일치하는 경우를 처리할 수 없습니다 ...".".... 사용자 데이터에서 이러한 상황이 발생할 수 있는지 여부가 확실하지 않기 때문에 지금은 이 문제에 대해 논의하지 않겠습니다. 교체를 두 번 실행하면 이러한 상황이 해결됩니다.

출력은 터미널에서 생성되므로 저장하려면 파일로 리디렉션하세요.

답변2

필드에 쉼표나 개행 문자가 없고 예제와 같이 모든 필드가 큰따옴표로 묶여 있다고 가정하면 모든 Unix 시스템의 모든 쉘에서 모든 sed를 사용할 수 있습니다.

$ sed 's/"//g; s/,/","/g; s/.*/"&"/' file
"Apple grape","Bananaorange","Red green"

답변3

우리가 따르는 큰따옴표는 항상 양쪽에 이웃이 있습니다. 이웃은 항상 쉼표가 아닙니다. 그러나 sed는 둘러보지 않으므로 정규식은 입력을 소비합니다. 그래서 우리는 반복해야 합니다.

sed -Ee '
  :loop
    s/([^,])"([^,])/\1\2/
  tloop
' file

Perl의 둘러보기는 간결합니다.

perl -lpe 's/(?<=[^,])"(?=[^,])//g' file

또는 필드 구분 기호를 형성하는 데 사용되는 큰따옴표를 변환합니다. 그렇다면 어떤 인용문이 눈에 띄고 어떤 인용문을 제거해야 할까요? 그런 다음 역변환을 수행합니다.

sed -Ee '
  s/^"|","|"$/\n/g
  s/"//g
  s/^\n|\n$/"/g
  s/\n/","/g
' file

참고: 확장 정규식 -E와 함께 GNU sed를 사용하세요.

답변4

GNU awk사용 gensub()기능 사용:

awk  '{print gensub(/([[:alpha:]]+)"([[:alpha:]]+)/,"\\1\\2","g")}' file
"Apple grape","Bananaorange","Red green"
"Apple grape","Bananaorange","Red green"

관련 정보