Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/16.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
在控制台中删除.xml文件的一部分_Xml_Bash_Replace_Sed_Console - Fatal编程技术网

在控制台中删除.xml文件的一部分

在控制台中删除.xml文件的一部分,xml,bash,replace,sed,console,Xml,Bash,Replace,Sed,Console,我试图递归地查找所有与模式*.xml匹配的文件,并删除其中的一些代码 这就是我想到的: 查找所有.xml文件并删除行 从第一次出现的def=something到第一次出现的 当我在包含许多文件的目录上调用它时 我的脚本中的bug在哪里?或者可能有更好/更简单的方法来实现这一点???是一个shell构造,不能与-exec主程序一起使用;它的参数直接传递给exec系列中的一个系统调用,而不是由shell处理find将和tmp.xml视为要传递给sed的另外两个字符串参数,而不是重定向,因此永远

我试图递归地查找所有与模式*.xml匹配的文件,并删除其中的一些代码

这就是我想到的:

  • 查找所有.xml文件并删除行
  • 从第一次出现的
    def=something
    到第一次出现的

当我在包含许多文件的目录上调用它时


我的脚本中的bug在哪里?或者可能有更好/更简单的方法来实现这一点???

是一个shell构造,不能与
-exec
主程序一起使用;它的参数直接传递给
exec
系列中的一个系统调用,而不是由shell处理
find
tmp.xml
视为要传递给
sed
的另外两个字符串参数,而不是重定向,因此永远不会创建
tmp.xml

一个选项是为每个文件显式启动shell:

find config/view -type f -name "*.xml" -exec \
  sh -c "sed -in '/def=something/,/<\/box>/!p' {} > tmp.xml && mv tmp.xml {}"
find config/view-type f-name“*.xml”-exec\
sh-c“sed-in'/def=something/,//!p'{}>tmp.xml&&mvtmp.xml{}”

另一个,正如fedorqui所建议的,是让
sed
使用
-i
选项来处理原子文件操作本身(注意
-i
的用法在不同的实现中略有不同;查看
sed
手册页了解详细信息)。

是一个shell结构,并且不能与
-exec
主设备一起使用;它的参数直接传递给
exec
系列中的一个系统调用,而不是由shell处理
find
tmp.xml
视为要传递给
sed
的另外两个字符串参数,而不是重定向,因此永远不会创建
tmp.xml

一个选项是为每个文件显式启动shell:

find config/view -type f -name "*.xml" -exec \
  sh -c "sed -in '/def=something/,/<\/box>/!p' {} > tmp.xml && mv tmp.xml {}"
find config/view-type f-name“*.xml”-exec\
sh-c“sed-in'/def=something/,//!p'{}>tmp.xml&&mvtmp.xml{}”

另一个,正如fedorqui所建议的,是让
sed
使用
-i
选项处理原子文件操作本身(注意
-i
的用法在不同的实现中略有不同;查看
sed
手册页了解详细信息)。

错误在于
-execed
语句中的
-find
,你没有执行:

sed -n '/def=something/,/</box>/!p' > tmp.xml {}
(请注意该行末尾的
+
),或者您可以:

find config/view -type f -name "*.xml" -exec bash -c 'sed -n "/def=something/,/<\/box>/!p" "$0" > tmp.xml; mv tmp.xml "$0"' {} \;
find config/view-type f-name“*.xml”-exec bash-c'sed-n“/def=something/,//!p”“$0”>tmp.xml;mv tmp.xml“$0”{}\;

但这并没有那么好。不过,如果您的
sed
不支持
-i
标志(GNU
sed
支持),它很有用。

错误在于
find
-exec sed
语句中没有执行:

sed -n '/def=something/,/</box>/!p' > tmp.xml {}
(请注意该行末尾的
+
),或者您可以:

find config/view -type f -name "*.xml" -exec bash -c 'sed -n "/def=something/,/<\/box>/!p" "$0" > tmp.xml; mv tmp.xml "$0"' {} \;
find config/view-type f-name“*.xml”-exec bash-c'sed-n“/def=something/,//!p”“$0”>tmp.xml;mv tmp.xml“$0”{}\;

但这并没有那么好。不过,如果您的
sed
不支持
-i
标志(GNU
sed
支持),它会很有用。

{}
不能这样使用@gniourf_gniourf是的,我知道我添加了{},因为没有{}之后出现了错误。它挂起了。
{}
不能像这样使用@gniourf_gniourf是的,我知道我添加了{},因为在>之后出现了错误,没有{}它挂起了。顺便说一句,in是坏的,并将文件中的行加倍。选项应该是-I-nbtw-in是坏的,将文件中的行加倍。选项应该是-I-n
find config/view -type f -name "*.xml" -exec bash -c 'sed -n "/def=something/,/<\/box>/!p" "$0" > tmp.xml; mv tmp.xml "$0"' {} \;