sedを使用して最初の一致を抽出する

sedを使用して最初の一致を抽出する

一連の線形があります。

Agenda HR-1 Presented by XYZ
HR-2 Debate-1 - All
HR-3 Debate-2 - All
(Cov-4) Conclusion 

[A-Za-z]\+-[0-9]\+各行には、1つ以上の文字、ダッシュ(-)、および1つ以上の数字で構成される(sed)パターンのIDがあります。キューのどこにでも表示されます。

IDを抽出する必要があります。私の考えは.*始めと終わりにaを貼り付けて印刷することですが、うまくいきません\1

これ回答によると、sedは最初の一致のみを置き換えると言われています。これは正しいです。

$ cat /tmp/scratch/x | sed -n   's/\<\([A-Za-z]\+-[0-9]\+\)/ID:\1/p'
Agenda ID:HR-1 Presented by XYZ
ID:HR-2 Debate-1 - All
ID:HR-3 Debate-2 - All
(ID:Cov-4) Conclusion

しかし、もちろん.*貪欲に最後のゲームに向かうことから始まります。

$ cat /tmp/scratch/x | sed -n   's/.*\<\([A-Za-z]\+-[0-9]\+\).*/ID:\1/p'
ID:HR-1
ID:Debate-1
ID:Debate-2
ID:Cov-4

私が考えることができる唯一の方法sedは、以下のように1つのコマンドからIDの周りにマーカーを追加し、別のコマンドを使用してそれを抽出することです。

sedでこれを行うより良い方法はありますか?

$ cat x | sed -n   's/\<\([A-Za-z]\+-[0-9]\+\)/<id>\1<~id>/;s/.*<id>\(.*\)<~id>.*/\1/;p'
HR-1
HR-2
HR-3
Cov-4

答え1

GNUを使用してawk次のことを試してください。

gawk -v FPAT='[A-Za-z]+-[0-9]+' '$1{print $1}' FILE

または:

gawk -v FPAT='[A-Za-z]+-[0-9]+' '$0=$1' FILE

答え2

を使用してsed次のことを試してください。

<FILE sed -En '/([[:alpha:]]+-[0-9]+).*/{ s//:\1/; s/.*://p; }'
  • 目的の一致後にすべてを削除します。
  • これで、一致は各行の終わりにあります。これはさまざまな方法で処理できます。
    • 上記は読みやすいです。char各マッチングの前にマッチング以外のアイテムを配置し、次のcharコマンドsを使用して最後のアイテムまですべてを削除します。
    • 2 番目sのコマンドの別のオプションは、一致に属さない文字の前のすべての項目を削除することです。
<FILE sed -En '/([[:alpha:]]+-[0-9]+).*/{ s//\1/; s/.*[^[:alnum:]-]//; p; }'

答え3

私たちはPerlできます:

$ perl -lne 'print /([a-z]+-\d+)/i' file

出力:

HR-1
HR-2
HR-3
Cov-4

関連情報