1

Linuxシェルでパターンが最初に出現してからn番目までの間にサブストリングを抽出しようとしています(sed、awk、...を使用)。

文字列の例:

AAA_BBBB__CCC__GGGG___fffffffffffffff_hhhh

"*_"(n個の連結されたアンダースコア)が最初に出現してからn番目が出現するまでのサブストリッグが必要です"*_"

たとえば、1回目と4回目の出現の間の部分文字列の結果は次のようになります。

BBBB__CCC__GGGG

sed、awk、またはその他のツールを使用して、これを行うための最良の方法は何でしょうか?

4

1 に答える 1

2

を使用する1つの方法がありsedます。これにより、1番目とn番目のオカレンスの間のサブストリングが選択されます。存在する番号は次の形式n - 1です。

sed 's/^[^_]\+_\+\(\(_*[^_]\+\)\{3\}\).*/\1/'

またはあなたが持っている場合GNU sed

sed -r 's/^[^_]+_+((_*[^_]+){3}).*/\1/'

テスト:

echo "AAA_BBBB__CCC__GGGG___fffffffffffffff_hhhh" | sed -r 's/^[^_]+_+((_*[^_]+){3}).*/\1/'

結果:

BBBB__CCC__GGGG


楽しみのために、行の先頭から任意の長さの任意の数のグループ間の部分文字列を検索するとします。たとえば、オフセットを4、長さを1にしようとしている場合は、次のことを試してください。

sed -r 's/^([^_]+_+){4}((_*[^_]+){1}).*/\2/'

結果:

fffffffffffffff

かなりかっこいいね?

于 2013-02-10T12:08:08.293 に答える