2015-05-19 67 views
2

我對這個東西相當陌生,我需要一個shell文件來遍歷文件夾中的所有「.xml」文件,並做一些文本替換。 到目前爲止,我想出了這一點:Unix Shell通過文件循環並替換文本

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

不過,我想這對所有的XML文件在當前文件夾而不只是「testfile.xml」運行。此外,我如何備份原始文件?

任何輸入都比歡迎! 非常感謝!

回答

4

要在所有的XML文件運行sed,只需指定通配符

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

要創建備份,只需指定-i後延:

sed "s/old_text/new_text/g" *.xml -i~ 

需要注意的是,通常最好使用XML感知工具來處理XML。

+1

...,只是祈禱,無論'old_text'也不'new_text'包含的任何'$,/,\ 1, &,?,*,(,),[,],\ +,。,等等。請注意,sed不能對字符串進行操作,它在具有受限字符集的正則表達式上運行。請參閱http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed/29626460#29626460並考慮使用對字符串進行操作的工具,例如AWK。通過在命令周圍使用單引號而不是雙引號,可以稍微降低破損風險。 –

+0

@EdMorton:true,但awk不解析XML,或者:) – choroba

+0

如果您使用XML庫,請參閱https://www.gnu.org/software/gawk/manual/html_node/gawkextlib.html,但主要是我只是想給自我聲明的新手一個頭,他不會使用sed的字符串。 –

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被附加到原始文件名稱)。

0

更詳細一點的例子,包括警告。 隨着大國意味着巨大的責任,並大量替代是指大國;-)

# 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