{}の代替正規表現

{}の代替正規表現

この行の数字だけを除いてすべて変更しようとしています。

looktype="123"

だから数字だけが表示されます。

これは簡単な方法で達成できますか?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

私はこれを試していますが、awk成功しませんでした。私は"sub"と{0、3}が干渉すると信じています。

答え1

存在する拡張正規表現(ERE)は、時間の間に繰り返されることを意味します。 awkは拡張正規表現を実装していますが、awkの歴史的実装には繰り返し間隔のこの中括弧構文はありませんでした。これX{m,n}XmnPOSIX規格awk が ERE をサポートする必要があることを指定しますが、既存の多くの実装は互換性がありません。

GNU awkを使って、間隔バージョン 4.0 以降のみサポートされます。以前のバージョンでは、POSIXLY_CORRECT環境変数をnull以外の値に設定して、gawkがPOSIXに準拠するように強制できます。

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

いくつかのディストリビューションでは、awkのデフォルトバージョンはgawkではなく、より小さく高速なmawkです。 Mawkは中括弧式をサポートしていません。この問題を解決するパッチがありますしかし、mawkは維持されていないので広く採用されていません。

繰り返し回数が少ない場合は、次のようにスペルを書くことができます。

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'

答え2

パイプを使用して、引用sed符内の内容のみを抽出できます。

例えば

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123

これは-rGNU sedに固有のもので、sedにデフォルトの正規表現の代わりに拡張機能を使用するように指示します。他のバージョンには存在しsedないか使用できます-E。そうでない場合は、POSIX基本正規表現(BRE)で次のように記述します。

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

答え3

awk(仮定精密投稿を入力してください。次のようにすることもできます。

awk -F'=' '{print $2}' | sed 's/"//g'

答え4

GNUの代替grep(Ubuntuタグがあると仮定):

grep -o '[0-9]\+' your_file

Perlのより移植性の高い代替

perl -nle '/([0-9]+)/ and print $1' your_file

2つのオプションはまったく同じではありません。同じ行に数値文字列の複数のインスタンスがある場合は、動作が異なります。このgrepステートメントは数字が出るたびに別々の行に印刷しますが、このperlステートメントは各行の左端に表示される数値文字列のみを印刷します。これはPerlの内部実装と正規表現エンジンの違いによるものですgrep

関連情報