문자열을 다른 문자열 쉘 스크립트로 교체


0

다음 형식의 파일이 있습니다.

"data","data","data",data".

이제 데이터에 데이터가 있으면 "파서는 파일을 구문 분석 할 수 없습니다. 그래서 대체하기 위해 sed를 사용하려면 """"가 보는 경우가 아니라 ","그 본질적으로 구분 때문이다.

sed 매개 변수가 무엇인지 알 수 없습니다.


데이터에 포함되어 있으면 어떻게 ","됩니까?
choroba

@ choroba 그 사건에 대해 내가 할 수있는 일은 없습니다. 일반적인 언어는 아니지만 CFG입니다 (내 용어가 정확하다고 생각합니다)
Cheetah

왜 세 단계를 거치지 않겠습니까 : 먼저 ","를 ~와 같은 것으로 바꾸십시오. 그런 다음 "를" ""로 변경하십시오. 그런 다음 ~를 ","로 다시 변경하십시오. (필요한 경우 데이터 대신에 ~ 대신에 무언가를 사용하십시오)
yosh m

답변:


2

나는 당신도 이것을 할 수 있다고 확신 sed하지만 Perl에서 나에게 훨씬 쉽습니다.

perl -pe 's/([^,])\"/$1xxx/g; s/xxx,/\",/g; s/xxx/\"\"\"/g' data.txt

설명:

  • perl -pe : 입력 파일의 각 행에서 명령 행에 제공된 스크립트를 실행하십시오.
  • s/([^,])\"/$1xxx/g;: "쉼표가 아닌 문자가 앞에 오는 모든 항목을 임의의 문자열로 대체하십시오 xxx. 데이터에 절대 포함되지 않는다고 가정합니다 xxx.
  • s/xxx,/\",/g;: xxx뒤에 쉼표가 오는 것으로 대체하십시오 ",.
  • s/xxx/\\\"/g: 나머지 xxx를 이스케이프 된 따옴표로 바꾸 십시오 \". 이것은 "데이터에있는 것입니다.

예:

$ cat test.txt
"data","da"t"a","data","data","foo "bar" foo", "data"

$ perl -pe 's/([^,])\"/$1xxx/g; s/xxx,/\",/g; s/xxx//g' test.txt 
"data","data","data","data","foo bar foo","data

나는 그들을 제거하고 싶지 않아, 그냥 탈출!
치타

@Ben, OK, 제거 대신 탈출하도록 답변을 수정했습니다.
terdon

고마워, 나는 실제로 당신이 한 훌륭한 설명에서 그림을 얻었습니다 ... 질문에 대답 할 때까지 대답을 받아들이고 싶지 않았습니다 ... 나는 nit-pick을 싫어하지만 탈출은 큰 따옴표가 아닙니다. op에 따라 백 슬래시
치타

당신은 @Ben을 따돌리고 있지 않습니다. 질문을 읽는 법을 배워야합니다. 지적 해 주셔서 감사합니다. 지금 작동합니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.