파이프로 구분된 파일이 있는데 파일을 한 줄씩 읽고 각 줄에서 닫히지 않은 따옴표(")를 검색한 다음 닫습니다.

파이프로 구분된 파일이 있는데 파일을 한 줄씩 읽고 각 줄에서 닫히지 않은 따옴표(")를 검색한 다음 닫습니다.

아래는 "20"을 "20"으로 닫아야 하는 줄입니다.

2019-02-15T10:25:19+0100|ttt|werewrw|erewr|fddsfsdf|dfsdf|07|2ee7|1b65d04|"20|19|-02-|15t10:03|45435435|765767||SIP;rr=200;text="hyt"|

답변1

이것을 테스트 파일로 사용해 보겠습니다.

$ cat text
start|10|"20|end
"10"|"20|"30"|end
"20|"10|"30|end
abc|def|"20"|30|"end

열려 있는 모든 항목을 닫으려면 "다음을 시도해 보세요.

$ sed -E 's/^("[^"|]*)\|/\1"|/; :a; s/(\|"[^"|]*)\|/\1"|/g; ta; s/\|"[^"|]*$/&"/' text
start|10|"20"|end
"10"|"20"|"30"|end
"20"|"10"|"30"|end
abc|def|"20"|30|"end"

어떻게 작동하나요?

닫히지 않은 따옴표가 첫 번째 필드, 중간 필드 또는 끝 필드에 나타날 수 있는 경우 고려해야 할 세 가지 상황이 있습니다. 따라서 세 가지 대체 명령이 있습니다.

  • s/^("[^"|]*)\|/\1"|/

    행이 따옴표로 시작하지만 첫 번째 따옴표 앞에 따옴표가 없으면 |따옴표가 추가됩니다.

  • :a; s/(\|"[^"|]*)\|/\1"|/g; ta;

    중간 필드에 인용문이 누락된 경우 인용문이 추가됩니다. 누락된 따옴표가 모두 추가되었는지 확인하기 위해 더 이상 변경 사항이 없을 때까지 바꾸기 명령이 반복됩니다.

  • s/\|"[^"|]*$/&"/

    마지막 필드에 닫는 따옴표가 없으면 해당 필드가 추가됩니다.

관련 정보