다음과 유사한 데이터가 포함된 CSV 파일이 있습니다.
"1b579a5e-9701-40eb-bd36-2bc65169da99","week14_Friday-019","6907eaad-1aff-4d26-9088-ba20374b67c0","2181-019","f20af5bb-c716-42e0-9b9d-cbolf5bfecea","15-BIO-2001","COLLEGE Bio 1","d39330be-df56-4365-8fb4-37e68d040c52","Which engine has the smaller efficiency?","{choices:[a","b","c","d],"type:MultipleChoice}","{solution:[0],"selectAll:false,{"selectMultiple:false",}"type:MultipleChoice}","2016-04-25 00:30:19.000","1922ac5a-6ff6-4ea4-9078-6df4d85d294f","{solution:[0],"type:MultipleChoice}","1","1116911f-8ee5-45c3-b173-a6be681bb15a","FakeLastName","FakeFirstName","[email protected]","Student"
큰따옴표 "를 제거하고 싶지만 중괄호 {} 안에 있는 경우에만 가능하며 sed 또는 awk를 사용하는 것이 좋습니다. 원하는 출력은 다음과 같습니다.
"1b579a5e-9701-40eb-bd36-2bc65169da99","week14_Friday-019","6907eaad-1aff-4d26-9088-ba20374b67c0","2181-019","f20af5bb-c716-42e0-9b9d-cbolf5bfecea","15-BIO-2001","COLLEGE Bio 1","d39330be-df56-4365-8fb4-37e68d040c52","Which engine has the smaller efficiency?","{choices:[a,b,c,d],type:MultipleChoice}","{solution:[0],selectAll:false,{selectMultiple:false,}type:MultipleChoice}","2016-04-25 00:30:19.000","1922ac5a-6ff6-4ea4-9078-6df4d85d294f","{solution:[0],type:MultipleChoice}","1","1116911f-8ee5-45c3-b173-a6be681bb15a","FakeLastName","FakeFirstName","[email protected]","Student"
어떤 도움이라도 대단히 감사하겠습니다. 감사해요!
답변1
다음 명령을 사용하면 더 쉬울 것입니다 sed
.
sed -e :1 -e 's/\({[^}]*\)"\([^}]*}\)/\1\2/g; t1'
또는 perl
:
perl -pe 's{\{.*?\}}{$& =~ s/"//gr}ge'
중첩이 없다고 가정합니다 {...}
.
중첩을 처리하려면 재귀 정규식 함수를 {...}
사용할 수 있습니다 .perl
perl -pe 's(\{(?:[^{}]++|(?0))*\})($& =~ s/"//gr)ge'
사용하는 경우 내부 를 제거하기 전에 sed
바깥쪽으로 확장하여 내부를 탈출하세요 .{...}
"
sed 's/_/_u/g
:1
s/\({[^{}]*\){\([^{}]*\)}/\1_<\2_>/g; t1
:2
s/\({[^}]*\)"\([^}]*}\)/\1\2/g; t2
s/_</{/g; s/_>/}/g;s/_u/_/g'
답변2
다음을 사용해 보세요 sed
.
$ sed -r ' :L; s/(\{[^"}]*)"(([^"}]*")*)([^"}]*\})/\1\2\4/g; tL; ' file
답변3
awk
중첩된 괄호의 경우:
awk -F{ '
{for (i=2; i<=NF; i++) {if (1 == n = split ($i, T, "}")) n++
for (j=1; j<n; j++) {RS = index ($i, T[j])
L = gsub (/"/, _, T[j])
$i = substr ($i, 1, RS-1) T[j] substr ($i, RS + length (T[j]) + L)
}
}
}
1' OFS="{" file
서투르지만 적어도 단일 중첩 중괄호에 대해 지정된 출력을 생성합니다.