次のテキストファイルがあります。
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
関連: