
この行全体を置き換えようとしていますが、数字が:
looktype="123"
数字だけが表示されます。
これは簡単な方法で可能ですか?
{sub ("look type=\"[0-9]{0,3}", "TEST")}
これを で試していますがawk
、うまくいきません。「sub」と {0, 3} が干渉していると思います。
答え1
で拡張正規表現(ERE)は、~回の間繰り返されることを意味します。awkは拡張正規表現を実装していますが、awkの歴史的な実装では繰り返し間隔を表すこの括弧構文はありませんでした。X{m,n}
X
m
n
POSIX標準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
は-r
GNU 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
。