我对这个东西相当新,我需要一个shell文件来遍历文件夹中的所有“.xml”文件,并进行一些文本替换。 到目前为止,我已经想出了这个:
sed "s/old_text/new_text/g" testfile.xml -i
但是,我想让它在当前文件夹中的所有xml文件上运行,而不仅仅在“testfile.xml”上运行。此外,如何备份原始文件?
欢迎任何输入! 非常感谢!
答案 0 :(得分:5)
要在所有xml文件上运行sed
,只需指定通配符
sed "s/old_text/new_text/g" *.xml -i
要创建备份,只需在-i
之后指定扩展名:
sed "s/old_text/new_text/g" *.xml -i~
请注意,使用XML感知工具处理XML通常会更好。
答案 1 :(得分:2)
对于位于当前目录中的所有.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
的参数将附加到原始文件名。)
答案 2 :(得分:1)
一个实用的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
警告:以强大的力量来承担巨大的责任,而大规模的替代意味着巨大的力量......