sedで行の最初の一致を抽出します

sedで行の最初の一致を抽出します

一連の線の形があります。

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

各行には (sed) パターンの ID があります[A-Za-z]\+-[0-9]\+。つまり、1 つ以上のアルファベットの後にダッシュ (-) が続き、その後に 1 つ以上の数字が続きます。これらは行のどこにでも出現します。

ID を抽出する必要があります。.*最初と最後に を貼り付けて を印刷しようと思ったのです\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

しかし、もちろん、.*開始時の a は貪欲に最後の一致に進みます。

$ 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; }'
  • 希望する一致の後のすべてを削除します
  • これで、一致は各行の末尾にあります。これはさまざまな方法で処理できます。
    • 上記は簡単に読み取ることができます。各一致の前に一致の一部ではないを配置し、 2番目のコマンドでchar最後まですべてを削除します。chars
    • 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

関連情報