Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Bash Shell脚本只影响文件,而不影响所有文件_Bash_Shell_Sed - Fatal编程技术网

Bash Shell脚本只影响文件,而不影响所有文件

Bash Shell脚本只影响文件,而不影响所有文件,bash,shell,sed,Bash,Shell,Sed,我正在使用shell脚本删除文件夹中一组文件的XML标记。以下是我的文件的外观: #!/bin/sh find texts -type f -name '*.xml' -exec sh -c ' mkdir -p modified file="$0" sed "s/<[^>]*>//g" "$file" > modified/modified_texts ' {} ';' 这将使用text文件夹中的$file获取所有文件,删除它们的XML标记,并

我正在使用shell脚本删除文件夹中一组文件的XML标记。以下是我的文件的外观:

#!/bin/sh
find texts -type f -name '*.xml' -exec sh -c '
    mkdir -p modified
    file="$0"
    sed "s/<[^>]*>//g" "$file" > modified/modified_texts
' {} ';'
这将使用text文件夹中的$file获取所有文件,删除它们的XML标记,并将没有XML标记的文件放入修改后的文件中

问题是,它不是获取所有文件,而是只使用一个文件,并用其中一个没有XML标记的文件的内容填充文件修改后的文本,这部分工作正常


我真的不明白我做错了什么,所以我非常感谢任何帮助。

而不是使用截断来执行输出重定向!对于每个sed命令,将其移动到外部作用域,以便在开始查找之前,打开输出文件并仅截断其先前的内容一次

#!/bin/sh
mkdir -p modified  # this only needs to happen once, so move it outside
find texts -type f -name '*.xml' -exec sed 's/<[^>]*>//g' {} ';' > modified/modified_texts

您的多行代码格式错误。请修复它。使用>>而不是像PhuNgo所说的>——你的代码运行在每个文件上,但它处理的每个文件都会删除修改后的文本的当前内容,并从头开始;因此,结果中只显示最后一个文件的内容。不过,比从>>切换到>,更好的方法是保持>修改/修改的文本不变,但将其移动到find命令的末尾。这样,您就不用每次运行sed时都重新打开输出文件,而是在开始查找之前只打开一次输出文件,并在整个执行过程中保持打开状态。谢谢。这就解决了问题。我没有意识到这对我来说似乎不起作用。不过,使用>>而不是>是可行的。但无论如何,谢谢您如果您需要使用>>,那么您将多次打开该文件。你应该修正你的代码中的任何东西,让它这样做,而不是仅仅做一个黑客的解决办法,使打开的文件是非破坏性的,同时仍然一遍又一遍地重新打开文件;如果你试图应用它,但失败了,你需要在我说话之前显示一个失败的复制器。这取决于OP想要如何使用脚本。如果他们想多次调用它,并且每次都附加到文件中,那么最好合并调用,只打开一次文件。