正则表达式删除一行

Regex to delete a line

我有以下模式:

"gear_size"=>"small",
"gear_size"=>"medium",
"name"=>"node.cip4pc.cisco.com",
"region_name"=>"CCS",
"gear_size"=>"large",
node.cip4pc.cisco.com:10.203.24.175,

我需要删除行 "gear_size"=>"small""gear_size"=>"large"
这两行没有"name"=> 遵循模式。
所以,基本上我需要删除 "gear_size" 行,"name" 后面没有。
我检查了命令 pcregrep 是否有效,但不支持此命令。
解决此问题的任何帮助都会很棒。
谢谢。

你可以使用这个 awk:

awk 'p && /name/{print p} {p=""} /gear_size/{p=[=10=]; next} 1' file
"gear_size"=>"medium",
"name"=>"node.cip4pc.cisco.com",
"region_name"=>"CCS",
node.cip4pc.cisco.com:10.203.24.175,

编辑:如果您需要名称直接跟在

之后,这是一个更好的解决方案
sed '/^"gear_size"/{N;/\n"name"=>/!D}'

如果行匹配 /^"gear_size"/,而下一行不匹配 /^"name"=>/,则删除它。

原文: gear_sizename

之间分离的可怕解决方案
sed '/gear_size/{h;d};/name/{x;/^$/!{p;s/.*//};x}' file

输出:

"gear_size"=>"medium",
"name"=>"node.cip4pc.cisco.com",
"region_name"=>"CCS",
node.cip4pc.cisco.com:10.203.24.175,

解释:

用匹配 /gear_size/ 的任何行替换 hold space 并删除该行(移至下一行而不打印)。

如果行匹配 /name/,则将行与保留 space 交换。如果 hold space 不为空,打印它包含的内容并清空它。换回来。

那么默认打印patternspace的内容