Bash:替換中的正規表示式

Bash:替換中的正規表示式

我有一個 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

相關內容