다음 내용이 포함된 파일이 있습니다.
some other content in this file
demo({
'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
'work': 'hard',
'study': 'science' },
'item2': { 'buy': 'apple', 'drink': x'cola',
'work': 'slow',
'eat': 'sweet',
'travel': 'world' },
'item3': { 'buy': 'bananna',
'drink': x'cooldrink',
'work': 'hard',
'study': 'science'}})
Some other content in this file.
이제 item2를 검색하고 다음을 삭제하고 싶습니다.
'item2': { 'buy': 'apple', 'drink': x'cola',
'work': 'slow',
'eat': 'sweet',
'travel': 'world' },
현재 저는 awk '!/'item2'/' filename
. 그러나 이렇게 하면 대괄호가 쉼표로 닫힐 때까지 해당 특정 줄만 삭제됩니다. 을 사용해 보았지만 까지 및 까지 pcregrep -Mo 'item2' filename
설정할 수 없습니다 .{
},
또한 을 제거해야 하는 경우 item3
끝에 쉼표가 없는 특별한 경우가 있습니다 ,
.
어떻게 해야 하는지 제안해 주세요.
답변1
$ perl -0777 -pe '$s="item1"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt
some other content in this file
demo({
'item2': { 'buy': 'apple', 'drink': x'cola',
'work': 'slow',
'eat': 'sweet',
'travel': 'world' },
'item3': { 'buy': 'bananna',
'drink': x'cooldrink',
'work': 'hard',
'study': 'science'}})
Some other content in this file.
$ perl -0777 -pe '$s="item3"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt
some other content in this file
demo({
'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
'work': 'hard',
'study': 'science' },
'item2': { 'buy': 'apple', 'drink': x'cola',
'work': 'slow',
'eat': 'sweet',
'travel': 'world' }})
Some other content in this file.
$ perl -0777 -pe '$s="item2"; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt
some other content in this file
demo({
'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
'work': 'hard',
'study': 'science' },
'item3': { 'buy': 'bananna',
'drink': x'cooldrink',
'work': 'hard',
'study': 'science'}})
Some other content in this file.
-0777
전체 파일을 읽고 여러 줄에 걸쳐 일치하도록s
표시하는 데 사용됩니다 ..*
s/ *\x27$s\x27:\s*\{.*?\},\n*//s
다음 과 같은item1
요소 의 경우item2
,
}
s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s
내 생각에 같은 요소 의 경우 이전 행에서 요소를item3
제거해야 할 것 같습니다.,
\x27
작은따옴표에 대한 16진수 코드$s="item2";
제거하고 싶은 요소로 변경하세요.
편집하다:
셸에서 변수 전달(참조SO에 대한 질문과 답변세부)
$ export var1='item3'
$ perl -0777 -pe '$s=$ENV{var1}; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt
some other content in this file
demo({
'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
'work': 'hard',
'study': 'science' },
'item2': { 'buy': 'apple', 'drink': x'cola',
'work': 'slow',
'eat': 'sweet',
'travel': 'world' }})
Some other content in this file.
여러 항목을 삭제할 수도 있습니다
$ export var1='(item3|item2)'
$ perl -0777 -pe '$s=$ENV{var1}; s/ *\x27$s\x27:\s*\{.*?\},\n*//s ; s/,\s*\x27$s\x27:\s*\{.*?\}(?!,)//s' ip.txt
some other content in this file
demo({
'item1': { 'buy': 'bananna', 'drink': x'cooldrink',
'work': 'hard',
'study': 'science' }})
Some other content in this file.