awkのフィールドセパレータとして正規表現を使用するには?


16

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

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

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

回答:


25

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

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

または

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

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

表現はありません、非常にあなたのロケールに応じて、同じ。「[0-9]、[[:digit:]]および\ dの違いを参照してください[0-9][[:digit:]]

プログラム自体に設定FSすることもできawkます。これはBEGIN1回限りの初期化であるため、通常はブロックで実行されます。

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

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


12

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

質問の他のエラー:

  • 単一引用符で囲まれた文字列内で単一引用符を使用することはできません
  • ==比較演算子で=あり、変数の割り当てに使用します

1
「アクションブロック内のFSの変更は、次の行が読み取られるまで有効になりません」その情報を探していました。
サミディスディス

1
プラス:awkの文字列値に単一引用符を使用することはできません。シェルから正しく渡しても
-dave_thompson_085
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.