この正規表現がawkで機能しないのはなぜですか?

この正規表現がawkで機能しないのはなぜですか?

次のテキストファイルがあります。

Attribute 1.............. : attribute value
Encode Date............................. : JUL 2007
Attribute 22076.......... : attribute value`

セグメントを抽出したいのですが、JUL 2007がファイルの他の場所に表示される可能性があるため、セグメントのJUL 2007前に「JUL 2007」がある場合にのみ可能です。Encode Date

次の正規表現は、グローバルモードと複数行モードが有効なPHPインタプリタを使用してregexr.comでテストするときに機能します。

(?<=Encode Date............................. : ).*$

ただし、このコマンドを実行しても何も起こりません。何が欠けていますか?

cat file.txt | awk '/(?<=Encode Date............................. : ).*$/{print $0}'

ベストアンサー1

awkサポートするPOSIX拡張正規表現(むしろ)。 Perl準拠の正規表現(PCRE)を使用しようとしています。 EREには(?<=...)(「リバース主張」)はありません。

入力からエンコードされた日付を取得するには、次の点を考慮してください。

awk -F ':' '$1 ~ /^Encode Date/ { sub("^ ", "", $2); print $2 }' file

これは各行を別々:のフィールドとして扱います。最初のフィールドが文字列で始まる行を選択しEncode Date、印刷する前にその行の2番目のフィールドの先頭からスペースを削除します。

使用するとsed少し短くなります。

sed -n '/^Encode Date/s/.*: //p' file

その後、正しい行を見つけて、:その直後のすべての空白を含めて削除し、変更された行を出力します。

または、sed各行を修正して正常に修正された行を印刷するのと同じ操作を使用します。

sed -n 's/^Encode Date.*: //p' file

行全体を印刷するには(最後のコマンドのように)、次のようにします。

awk '/^Encode Date/' file

または、

sed -n '/^Encode Date/p' file

または、

grep '^Encode Date' file

関連:

おすすめ記事