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ガイドそれは次のように述べています。

2 つの正規表現は、中置演算子「|」によって結合できます。結果の正規表現は、いずれかの部分式に一致する任意の文字列と一致します。

しかし、私にはうまくいきません。何が足りないのでしょうか?

shopt -s extglob次のように式を設定して定式化しようとしましたが[0-9][0-9]?、これも機能しませんでした。

私は Ubuntu 14.10 を使用しており、標準の bash バージョンは 4.3.30 です。 でスクリプトを実行しますbash foo.sh

答え1

パラメータ展開の置換は正規表現では機能しません。extglobはここで役立ちますが、これも正規表現では機能しません。

下の式の正しい構文extglob

re='+([0-9])'

つまり、数字を 1 回以上繰り返します。

テスト:

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

パターンを置き換えるだけの場合は、bash ではなく sed または perl を使用することをお勧めします。

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

関連情報