GNU/Linux >> Linux の 問題 >  >> Ubuntu

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」式が正しく解釈されず、元の行が出力されます。理由がわかりません。これは、1桁の数字、つまりre='[0-9]'に対して機能します。 。

式を定式化するために、私は初心者向けのBashガイドからの情報を使用しました。

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

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

shopt -s extglobを設定しようとしたことに注意してください [0-9][0-9]?のような式を作成します しかし、それもうまくいきませんでした。

私はUbuntu14.10を使用しており、ストックbashバージョン4.3.30を使用しています。 bash foo.shを使用してスクリプトを実行します 。

承認された回答:

パラメータ展開の置換は、正規表現では機能しません。 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

Ubuntu
  1. 正規表現:すべてをまとめる

  2. LinuxでのBash履歴での単語修飾子の使用

  3. Bashで$(コマンド置換)内で引用しますか?

  1. 値のリストをBashスクリプトにパイプしますか?

  2. Bash +正規表現で名前を確認しますか?

  3. sed の正規表現で `\d` が機能しないのはなぜですか?

  1. 正規表現の紹介

  2. Bash の正規表現の問題:[^negate] が機能しないようです

  3. grep 抽出番号範囲