我對這個東西相當陌生,我需要一個shell文件來遍歷文件夾中的所有「.xml」文件,並做一些文本替換。 到目前爲止,我想出了這一點:Unix Shell通過文件循環並替換文本
sed "s/old_text/new_text/g" testfile.xml -i
不過,我想這對所有的XML文件在當前文件夾而不只是「testfile.xml」運行。此外,我如何備份原始文件?
任何輸入都比歡迎! 非常感謝!
我對這個東西相當陌生,我需要一個shell文件來遍歷文件夾中的所有「.xml」文件,並做一些文本替換。 到目前爲止,我想出了這一點:Unix Shell通過文件循環並替換文本
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感知工具來處理XML。
對於所有.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
被附加到原始文件名稱)。
更詳細一點的例子,包括警告。 隨着大國意味着巨大的責任,並大量替代是指大國;-)
# 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, &,?,*,(,),[,],\ +,。,等等。請注意,sed不能對字符串進行操作,它在具有受限字符集的正則表達式上運行。請參閱http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed/29626460#29626460並考慮使用對字符串進行操作的工具,例如AWK。通過在命令周圍使用單引號而不是雙引號,可以稍微降低破損風險。 –
@EdMorton:true,但awk不解析XML,或者:) – choroba
如果您使用XML庫,請參閱https://www.gnu.org/software/gawk/manual/html_node/gawkextlib.html,但主要是我只是想給自我聲明的新手一個頭,他不會使用sed的字符串。 –