一連の線の形があります。
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
最後まですべてを削除します。char
s
- 2 番目のコマンドの別のオプション
s
は、一致に含まれない文字まですべてを削除することです。
- 上記は簡単に読み取ることができます。各一致の前に一致の一部ではないを配置し、 2番目のコマンドで
<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