次の標準のcsvファイルではなく、カンマ区切りのファイルがあります。
XYZ,143,ABC/genomes/date/pa341,dog,available
567,FTR/genomes/date/ha76870,horse,waiting
214,GEN/genomes/date/btr256,N/A,avialable,stored
...
「/genomes」で始まり、次のカンマ「、」文字まですべての文字列を抽出したいと思います。予想される出力は次のとおりです。
/genomes/date/pa341
/genomes/date/ha76870
/genomes/date/btr256
以下を試しましたが、不要な追加情報が印刷されます。
grep -o '/genomes.*,' myfile.txt
output:
/genomes/date/pa341,dog,
/genomes/date/ha76870,horse,
/genomes/date/btr256,N/A,stored
答え1
*
「できるだけ長い文字列と一致」を意味するため、メソッドは失敗します。これを「貪欲な」修飾子といいます。貪欲ではない演算子である「できるだけ短い文字列と一致する」が欲しい。したがって、サポートしている場合は、次のように拡張正規表現をgrep
有効にして実行します。-P
$ grep -Po '/genomes.*?,' file
/genomes/date/pa341,
/genomes/date/ha76870,
/genomes/date/btr256,
しかし、より良いアプローチは、,
文字ではなく文字をできるだけ一致させることです。
$ grep -o '/genomes[^,]*' file
/genomes/date/pa341
/genomes/date/ha76870
/genomes/date/btr256
答え2
情報を取得するいくつかの方法は次のとおりです。
$ grep -oP '/genomes((?!,).)*' myfile.txt
$ perl -F, -pale '
shift @F until $F[0] =~ m{/genomes.*};
$_ = $&;
' myfile.txt
$ perl -lne '
my $p1 = index $_, "/genomes";
my $p2 = index $_, ",", $p1;
print substr $_, $p1, $p2-$p1;
' myfile.txt
$ sed -ne '
/\n/!s|/genomes|\n&|
y/,/\n/
/^\/genomes/!D;P
' myfile.txt
結果:
/genomes/date/pa341
/genomes/date/ha76870
/genomes/date/btr256