我想从一个字符中删除一行,直到其他字符匹配

我想从一个字符中删除一行,直到其他字符匹配

我有一个内容如下的文件:

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' },

目前我正在做 as 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单引号的十六进制代码
  • 只需更改$s="item2";为要删除的所需元素


编辑:

从 shell 传递变量(参见关于 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.

相关内容