在控制台中删除.xml文件的一部分
我试图递归地查找所有与模式*.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文件并删除行
- 从第一次出现的
到第一次出现的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
标志(GNUsed
支持),它很有用。错误在于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
标志(GNUsed
支持),它会很有用。{}
不能这样使用@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"' {} \;