Unix Shell循环文件并替换文本

时间:2015-05-19 08:24:49

标签: shell loops unix sed

我对这个东西相当新,我需要一个shell文件来遍历文件夹中的所有“.xml”文件,并进行一些文本替换。 到目前为止,我已经想出了这个:

sed "s/old_text/new_text/g" testfile.xml -i

但是,我想让它在当前文件夹中的所有xml文件上运行,而不仅仅在“testfile.xml”上运行。此外,如何备份原始文件?

欢迎任何输入! 非常感谢!

3 个答案:

答案 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

警告:以强大的力量来承担巨大的责任,而大规模的替代意味着巨大的力量......