다른 문자가 일치할 때까지 한 문자의 줄을 삭제하고 싶습니다.

다른 문자가 일치할 때까지 한 문자의 줄을 삭제하고 싶습니다.

다음 내용이 포함된 파일이 있습니다.

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.

관련 정보