web-dev-qa-db-ja.com

awkでフィールド区切り文字として正規表現を使用するにはどうすればよいですか?

awkのフィールドセパレーターとして正規表現を使用しようとしています。私の読書からこれは可能に思われますが、構文を正しく得ることができません。

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

考え?明らかでないとしても、バージョン番号なしのソフトウェアのリストを取得することが目標です。

17
Gray Race

あなたはあなたの引用と構文をだましました。入力フィールド区切り文字を設定するには、コマンドラインで-Fオプションを使用するのが最も簡単な方法です。

awk -F '[0-9]' '{ print $1 }'

または

awk -F '[[:digit:]]' '{ print $1 }'

これは、任意の数字を入力フィールド区切り文字として使用し、各行の最初のフィールドを出力します。

ロケールによっては、[0-9][[:digit:]]の式はまったく異なります。 「 [0-9]、[[:digit:]]、\ d の違い」を参照してください。

FSプログラム自体にawkを設定することもできます。これは1回の初期化なので、通常BEGINブロックで行われます。

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

シェルでは、単一引用符は単一引用符で囲んだ文字列では使用できず、awk文字列は常に二重引用符を使用することに注意してください。

27
Kusalananda

クサラナンダの答えの+1。または、FS変数をBEGINブロックで設定できます。

awk 'BEGIN {FS="[0-9]"} {print $1}'

アクションブロックでFSを変更すると、次の行が読み取られるまで有効になりません

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

質問の他のエラー:

  • 一重引用符で囲まれた文字列内では一重引用符を使用できません
  • ==は比較演算子、=は変数割り当て用です
13
glenn jackman