非常に長い文字列を含むファイルがあり、その部分文字列を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を動的に作成する必要がある場合は、これを行う方法は非常に明確でなければなりません。