一連の線形があります。
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