![我想从一个字符中删除一行,直到其他字符匹配](https://linux22.com/image/94000/%E6%88%91%E6%83%B3%E4%BB%8E%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%AD%E5%88%A0%E9%99%A4%E4%B8%80%E8%A1%8C%EF%BC%8C%E7%9B%B4%E5%88%B0%E5%85%B6%E4%BB%96%E5%AD%97%E7%AC%A6%E5%8C%B9%E9%85%8D.png)
我有一个内容如下的文件:
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.