この行の数字だけを除いてすべて変更しようとしています。
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を使って、間隔バージョン 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
これは-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
。