Shell 如何删除包含在特定图案之后首次找到的图案的行
我正在编写一个shell脚本来删除特定组中的条目。例如:文件名是dest.xmlShell 如何删除包含在特定图案之后首次找到的图案的行,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"> &
<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