Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/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
Shell 如何删除包含在特定图案之后首次找到的图案的行_Shell_Unix_Sed - Fatal编程技术网

Shell 如何删除包含在特定图案之后首次找到的图案的行

Shell 如何删除包含在特定图案之后首次找到的图案的行,shell,unix,sed,Shell,Unix,Sed,我正在编写一个shell脚本来删除特定组中的条目。例如:文件名是dest.xml <domain id="1" group_name="group1"> <node id="ABC"> <node id="PQR"> <node id="XYZ"> </domain> <domain id="2" group_name="group2"> <node id="PQR"> &

我正在编写一个shell脚本来删除特定组中的条目。例如:文件名是dest.xml

<domain id="1" group_name="group1">
    <node id="ABC">
    <node id="PQR">
    <node id="XYZ">
</domain>
<domain id="2" group_name="group2">
    <node id="PQR">
    <node id="XYZ">
</domain>
<domain id="3" group_name="group3">
    <node id="ABC">
    <node id="PQR">
 </domain>

我想从上面的文件(文件名为dest.xml)中从组_name=“group1”中删除节点id=“PQR”的条目(不应从组2和组3中删除)。我可以通过顺序读取一个文件,然后从特定组中删除它。但如果文件太大(>10k行),则需要时间

有什么简单的方法可以做到这一点吗?

您可以通过以下方式实现:

echo'
“|sed-e'/group_name=“group1”/,//{/node id=“PQR”/d;}”
建议用法:
mv dest.xml dest.bak&&sed-e'/group_name=“group1”/
/节点id=“PQR”/d;
}'dest.bak>dest.xml
科恩壳牌: 请注意,环境变量不会在单引号内展开。如果希望在脚本中嵌入此命令,则需要对该命令使用双引号,然后在程序中转义双引号:

#!/bin/ksh
gp_name=group1
entry=PQR
mv dest.xml dest.bak && sed -e "/group_name=\"${gp_name}\"/,/<\/domain>/ {
    /node id=\"${entry}\"/d;
}" dest.bak > dest.xml
#/bin/ksh
gp_name=group1
条目=PQR
mv dest.xml dest.bak&&sed-e“/group\u name=\“${gp\u name}\”/,/{
/节点id=\“${entry}\”/d;
}“dest.bak>dest.xml

嗨,约翰,谢谢你的帮助。但当我使用变量而不是直接给出值时,它就不起作用了。我写了剧本/bin/ksh gp_name=group1 entry=PQR mv dest.xml dest.bak&&sed-e'/group_name=“$gp_name”/,//{/node id=“$entry”/d;}”dest.bak>dest.xml我哪里出错了?@user1127981:很乐意帮助!
mv dest.xml dest.bak && sed -e '/group_name="group1"/,/<\/domain>/ { 
        /node id="PQR"/d; 
    }' dest.bak > dest.xml
#!/bin/ksh
gp_name=group1
entry=PQR
mv dest.xml dest.bak && sed -e "/group_name=\"${gp_name}\"/,/<\/domain>/ {
    /node id=\"${entry}\"/d;
}" dest.bak > dest.xml