4

ファイル内の名前をキャプチャする正規表現を作成しようとしています。一部の行には、キャプチャする必要がある 2 つ以上の名前が含まれている場合があります。

たとえば、次のファイルを取得したいと思います。

Field_1 \t Field_2 \t Field_3 \t JGN;Name=hsa-123;J4N9;Name=cfa-241-b
Field_1 \t Field_2 \t Field_3 \t JPN;Name=hsa-1323;JJ39;Name=cfa-255-b;Name=hsa-188

そして、出力ファイルを返します:

Field_1 \t Field_2 \t Field_3 \t hsa-123; cfa-241-b
Field_1 \t Field_2 \t Field_3 \t hsa-1323;cfa-255-b;hsa-188

次のように正規表現を使用しています。

sed 's/\(.*\)\t\(.*\)\t\(.*\)\t.*\;Name=\(.*\);.*/\1\t\2\t\3\t\4\;\4/g'

ただし、これは名前のみを返します。どんな提案でも大歓迎です

4

2 に答える 2

5

する

sed 's/\([[:space:]]\|;\)[[:alnum:]]*;/\1/g; s/Name=//g'

あなたのために働きますか?

于 2012-10-25T20:03:15.240 に答える
0
$ sed -E 's/ [^ ;]+;//; s/;[^=]+;/;/g; s/Name=//g' file
Field_1 \t Field_2 \t Field_3 \thsa-123;cfa-241-b
Field_1 \t Field_2 \t Field_3 \thsa-1323;cfa-255-b;hsa-188

sed が ERE (-E) をサポートしていない場合は、[^ ;]+ を [^ ;][^ ;]* に変更し、[^=]+ を [^=][^=]* に変更するか、awk を [ g]sub()。

于 2012-10-25T20:28:30.373 に答える