
テキスト パターン内の数値を置換する 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