대괄호 사이의 데이터를 바꾸고 다른 일을 무시합니다.

대괄호 사이의 데이터를 바꾸고 다른 일을 무시합니다.

다음 데이터가 포함된 csv 파일이 있습니다.

입력하다

"01","5","Male","[""No.**"",""**kg""]","","",""  
"02","6","FeMale","[""No.""]","","",""

대괄호 사이의 "," 문자열을 바꾸고 싶지만 대괄호 외부의 데이터는 바꾸고 싶지 않습니다.

산출:

"01","5","Male","[""No.**,**kg""]","","",""  
"02","6","FeMale","[""No.""]","","",""

아래 명령을 시도했지만 대괄호 외부의 데이터가 바뀌었지만 모든 행이 바뀌지는 않았습니다.

sed '/\[/,/\]/s/"",""/,/'

답변1

sed '/\[/,/\]/s/"",""/,/'

[그러면 a가 있는 행을 찾은 다음 a가 있는 행을 찾고 ]해당 행 사이의 각 행에서 처음 발견된 행을 대체합니다 "","". 실제로 [..]그들이 연속적으로 어디에 있는지 에 초점을 맞추지 않습니다 .


0차 시도로 다음과 같습니다.

$ cat x
"01","5","Male","[""No.**"",""**kg""]","","","" 
$ sed 's/\(\[.*\)"",""\(.*\]\)/\1,\2/g' x
"01","5","Male","[""No.**,**kg""]","","","" 

패턴은 a [, everything "","", everything 및 a와 일치하며, 조각을 다시 합칠 수 있도록 ]the를 제외한 모든 항목을 캡처합니다 ."",""

[..],"","",[..]이로 인해 ( "",""a가 표시되기 전에 대괄호가 닫히고 패턴 검색이 이어짐 ]) 및 [.."","".."",""..]( "",""대괄호 안의 여러 시퀀스, 하나만 제거됨) 과 같은 문제가 발생합니다 .

이는 Perl의 경우 더 일반적이지만 대체 내 대체가 끔찍한 트릭입니다. 대신에 적절한 파서를 사용해야 할 것입니다:

$ cat y
no removal here: [...],"","",[...]
double removal here: [  "",""  "",""  ]
[""remove"",""here""],""not"",""here"",[""also"",""here""]

$ perl -pe 'sub x {$a = shift; $a =~ s/"",""/,/g; return $a;}
     s/(\[.*?\])/ x($1)  /eg  ' y
no removal here: [...],"","",[...]
double removal here: [  ,  ,  ]
[""remove,here""],""not"",""here"",[""also,here""]

( .*?욕심없는 일치의 경우 가능한 한 빨리 중지됩니다. ]이 경우 처음입니다.)

답변2

sed '/"Male/s/"",""/,/1' filename

산출:

"01","5","Male","[""No.**,**kg""]","","",""
"02","6","FeMale","[""No.""]","","",""

관련 정보