awkとsedを使用して文字の部分文字列を置き換える

awkとsedを使用して文字の部分文字列を置き換える

非常に長い文字列を含むファイルがあり、その部分文字列をNに置き換えたいと思います。例:

テスト

ABCDABCDABCD

awkコマンドとsedを使用して、部分文字列をすべての文字N(インデックス5から8までのすべての文字)に置き換えたいので、文字Nの合計長は4です。

出力

ABCDNNNNABCD

私は次のことを試しました:

awk '{ v=substr($0,5,4); sed -i "s/$v/N/g";print substr($0,1,4)""v""substr($0,9,12)}' test

ただし、このコマンドは次の出力を提供するようです。

ABCDABCDABC

そして交換は行われませんでした

交換を開始する場所のインデックス番号(例:5)と交換長番号(ここでは4)をコードに含めたいと思います。したがって、開始したい場合は、その数を変更できます。実際には、何千もの文字で構成された文字列があり、何百もの文字を置き換えたいので、私の場合はパターン置換が機能しないので、別の場所で別の長さの置換を実行してください。

ベストアンサー1

GNU awkを使用すると、次のことができます。

gawk -v start=5 -v end=8 '{
    mid = substr($0, start, end-start+1)
    print substr($0, 1, start-1) gensub(/./, "N", "g", mid) substr($0, end+1)
}' file

またはパールを使用してください

perl -spe 'substr($_, $start-1, $end-$start+1) =~ s/./N/g' -- -start=5 -end=8 file

どちらのソリューションもコマンドラインオプションを使用して、開始値と終了値をプログラムに渡します。これにより、シェルスクリプトで値を簡単に変更できます。代替ロールNを動的に作成する必要がある場合は、これを行う方法は非常に明確でなければなりません。

おすすめ記事