我对这方面还比较新,需要一个shell文件来循环处理文件夹中的所有“.xml”文件,并进行一些文本替换。
到目前为止,我想出了以下方法:
sed "s/old_text/new_text/g" testfile.xml -i
然而,我希望这能在当前文件夹中运行所有的xml文件,而不仅仅是“testfile.xml”。此外,我该如何备份原始文件?
欢迎提供任何意见!非常感谢!
要在所有的xml文件上运行sed
,只需指定通配符即可。
sed "s/old_text/new_text/g" *.xml -i
要创建备份,只需在-i
后指定扩展名:
sed "s/old_text/new_text/g" *.xml -i~
针对当前目录下所有的.xml
文件:
sed -i.bak 's/old_text/new_text/g' *.xml
find
结合使用:find . -name '*.xml' -exec sed -i.bak 's/old_text/new_text/g' '{}' \;
.xml.bak
的方式结束(-i
参数将附加到原始文件名后面)。一个实用的Shell脚本,如果你想要使用多种方法来清理一堆文件 - 这些方法在单行命令中会变得有点不切实际...
# only take files form certain subfolders and certain extensions
# be careful to not tamper with .git or .svn folders
# - thus excluding all hidden folders as an extra precaution
# - also tampering with node_modules is a bad idea
FILES=$(find . -type f -regextype posix-extended \
-regex "^\./(public|source)/.*\.(scss|js)$" \
-not -regex ".*\/(\.|node_modules).*")
for f in $FILES
do
echo "Processing $f file..."
# all files: prune trailing whitespace on each file.
sed -i 's/ *$//' $f
if [[ $f =~ \.js$ ]]; then
echo "javascript file!"
# DO stuff
fi
if [[ $f =~ \.scss$ ]]; then
echo "scss file!"
# \b whole word matching – stackoverflow.com/a/1032039/444255
sed -i 's/\#000\b/black/g' $f
sed -i 's/\#000000\b/black/g' $f
sed -i 's/\#fff\b/white/g' $f
sed -i 's/\#ffffff\b/white/g' $f
fi
done
注意:伴随着强大的能力而来的是巨大的责任,批量替换意味着拥有了强大的能力...
old_text
和new_text
都不包含任何$, /, \1, &, ?, *, (, ), [, ], \+, ., etc
等字符。请注意,sed不是操作字符串,而是操作具有受限字符集的正则表达式。请参考https://dev59.com/ul0b5IYBdhLWcg3wGN0s#29626460,并考虑使用一个可以操作字符串的工具,例如awk。您可以通过在命令周围使用单引号而不是双引号来稍微降低出错的风险。 - Ed Morton