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

标签 xml bash replace sed console

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

这是我想出的:

  • 查找所有 .xml 文件并删除行
  • 从第一次出现def=something开始到第一次出现 </box>

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

它适用于目录中的 1 个文件,但它给出:

mv: cannot access tmp.xml

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

我的脚本中的错误在哪里?或者也许有更好/更简单的方法来做到这一点?

最佳答案

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

sed -n '/def=something/,/</box>/!p' > tmp.xml {}

(带有重定向)。

事实上,你的行相当于:

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

也就是说,find 的所有输出都被重定向到文件tmp.xml。然后,在找到第一个文件后,tmp.xml 不再存在(因为它已被移动),一切都搞砸了!

要解决这个问题,您可以使用内联编辑,如 fedorqui 的答案所示:

find config/view -type f -name "*.xml" -exec sed -i -n '/def=something/,/<\/box>/!p' {} +

(注意行尾的 +),或者您可以:

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

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

关于xml - 在控制台中删除 .xml 文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451208/

相关文章:

python - Element Tree对xpath的限制

xml - Saber 检索行程 Soap API 错误

linux - linux删除重复文件的方法

bash - 在 unix 中按数字和字典对单个字段进行排序?

c# - 应用程序运行时替换exe文件

java - 如何在 Java 中处理 XML 从 xml 数据库检索数据

java - 无法阻止用户使用带有自定义 UserDetail 和 AuthenticationProvider 的 spring security 多次登录

linux - 在版本名称和版本号之间进行过滤

Objective-C 字符串替换

Java正则表达式替换基于操作系统的文件路径