{} の代替正規表現

{} の代替正規表現

この行全体を置き換えようとしていますが、数字が:

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では、間隔POSIXLY_CORRECTバージョン 4.0 以降でのみサポートされています。古いバージョンでは、環境変数を空でない値に設定することで、gawk を POSIX 準拠に強制することができます。

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

一部のディストリビューションの awk のデフォルト バージョンは gawk ではなく mawk です。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

関連情報