Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 删除多行-从";“模式”;通过第二次出现“匹配”;模式B“;_Awk_Sed - Fatal编程技术网

Awk 删除多行-从";“模式”;通过第二次出现“匹配”;模式B“;

Awk 删除多行-从";“模式”;通过第二次出现“匹配”;模式B“;,awk,sed,Awk,Sed,我想使用sed或类似工具查找包含“某物””的行,并删除该行和所有后续行,直到第二次出现包含“fi”的行 例如 如果我有以下文件/somepath/somefile,其中包含: ... # Test something? if something then do something if somethingelse then do somethingelse fi fi ... 我想找到并删除所有这些行,从包含“something?”的行开始,到包含第二行“fi”的行 我可以使用sed-n'

我想使用
sed
或类似工具查找包含“
某物”
”的行,并删除该行和所有后续行,直到第二次出现包含“
fi
”的行

例如

如果我有以下文件
/somepath/somefile
,其中包含:

...

# Test something?
if something
then
do something
if somethingelse
then
do somethingelse
fi
fi

...
我想找到并删除所有这些行,从包含“
something?”的行开始,到包含第二行“
fi
”的行

我可以使用
sed-n'/something?/q删除从包含“
something?”的行开始到文件结尾的所有行;p'
但我不知道如何在包含“
fi
”的第二行之后添加一个条件来表示stop。非常感谢您的帮助。

您可以使用Awk:

awk 'BEGIN { del=0 } /Test something\?/ { del=2 } del<=0 { print } /fi/ { del -= 1 }' your-file
awk'BEGIN{del=0}/用GNU sed测试某物\?/{del=2}del:

sed '/something?/,/fi/{/fi/N;d}' file

如果您想“就地”编辑您的文件,请使用sed的选项
-i

非常有效,谢谢!还教了我一些关于awk的知识。所以,假设我想删除第一次或第三次或第四次出现的
fi
,我会简单地更改
{del=2}
?要删除第四次
fi
之前的所有内容,您需要将
{del=2}
替换为
{del 4}
,是的。完美,我想我最喜欢这个解决方案是因为这个。@nwk,你介意详细说明一下你的例子吗?“del=”如何导致del=0和del=2之间的行被删除?你能把我和一个解释联系起来吗?或者让我简单地讲几行逻辑?谢谢@新手Awk程序由模式和动作组成。这里唯一打印任何内容的模式动作对是
del