
我有一個 bash 腳本來替換文字模式中的數字值。假設我有一個這樣的文件:
word5word
word55word
我希望它看起來像這樣:
word125word
word125word
我有這個腳本來做到這一點:
#!/bin/bash
re='([0-9]|[0-9][0-9])'
while read line
do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done < /home/tomak/test.txt
由於某種原因,“re”表達式沒有被正確解釋,並且它會列印原始行。我就是不懂為什麼。它適用於單一數字,即re='[0-9]'
。
為了製定表達式,我使用了來自Bash 初學者指南其中指出:
兩個正規表示式可以透過中綴運算子「|」連接;產生的正規表示式與符合任一子表達式的任何字串相符。
但這對我來說不起作用。我缺什麼?
請注意,我嘗試設定shopt -s extglob
並製定類似的表達式[0-9][0-9]?
,但這也不起作用。
我使用的是 Ubuntu 14.10,而且有 bash 版本 4.3.30。我用 運行腳本bash foo.sh
。
答案1
參數擴充的替換不適用於正規表示式。extglob
可以在這裡為您提供幫助,但它也不適用於正規表示式。
下面的表達式的正確語法extglob
是
re='+([0-9])'
即一個數字一次或多次。
測試:
re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done
輸出:
word125word
word125word
答案2
如果您只是替換模式,我建議使用 sed 或 perl 而不是 bash:
sed -e 's/word[0-9]\+word/word125word/g' /home/tomak/test.txt
或者
perl -pe 's/word\d+word/word125waord/g' /home/tomak/test.txt