다음 데이터가 포함된 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.""]","","",""