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 

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

回答

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

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

または

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

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

[0-9]式と[[:digit:]]式は、ロケールによってはまったく同じではありません。 「 [0-9]、[[:digit:]]、\ d の違い」を参照してください。

を設定することもできます。 awkプログラム自体のdivid = “ddb3b78de7″>

。これは通常、BEGINブロックで実行されます。これは、「1回限りの初期化:

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

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

コメント

  • FSにアクセスして、一致した文字列を確認することはできますか?

回答

+1 for Kusalananda “s answer。または、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 

質問の他のエラー:

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

コメント

  • " Changiアクションブロック内のFSは、次の行が読み取られるまで'有効になりません" I 'その情報を探し回っています。
  • plus:'から渡したとしても、awkの文字列値に一重引用符を使用することはできません。シェルは正しく
  • FSにアクセスして、一致した文字列を確認することはできますか?
  • FSは変数なので、次のようなことを行います。その他の変数(例:print FS)。 POSIX awkでFSに一致するパーツを取得するには、できないと思います。 GNU awkを使用すると、n = split($0, fields, FS, separators)と書くことができます。ここでfieldsseparatorsは配列です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です