• ベストアンサー

特定のエリアの置換

固定長のデータファイルで特定のエリア(例えば300列目から315列目)のデータを全てブランクに置換したいといったコマンドを作りたいのですが、 どのようなコマンドを組み合わせればできるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

perlを使う場合、perl の substrは代入可能な値を返すので、 substr($_, start, length) = "書き換えたい値" のように書けます。ただし、データが316桁以上ないとおかしな ことになると思います。 perl -pe 'substr($_, 299, 16) = q{ } x 16' といった感じで(substrの第二引数は0オリジンで数えるので1から数えて 300桁目なら299が該当します)。 また最近のバージョンであれば、第四引数に置き換えのデータを指定できるので perl -pe 'substr($_, 299, 16, q{ } x 16)' という手もあります。

totmon
質問者

お礼

大変参考になりました。ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

#2です。投稿時に空白が削られてしまいました。(^^; 1番目と2番目のコマンドは、必要な数だけ空白を入れてください。 >awk '{print substr($0,1,309) "(ここに16個の空白を入れる)" substr($0,316)}' in.txt > out.txt >perl -pe 's/^(.{309}).{16}(.*)$/\1(ここに16個の空白を入れる)\2/' in.txt > out.txt

すると、全ての回答が全文表示されます。
回答No.2

>awk '{print substr($0,1,309) " " substr($0,316)}' in.txt > out.txt とか、 >perl -pe 's/^(.{309}).{16}(.*)$/\1 \2/' in.txt > out.txt とか、 16個の空白を数えて入れるのが気に入らなければ >perl -pe 's/^(.{309}).{16}(.*)$/print "$1" . ( " " x 16 ) . "$2"/e' in.txt > out.txt とか、 他にもいろいろ方法はあると思いますが、、、。

totmon
質問者

補足

大変参考になりました。ありがとうございました。

すると、全ての回答が全文表示されます。
  • mtfoggy
  • ベストアンサー率14% (37/255)
回答No.1

sed、awk、perl など、お好きなのをどうぞ。

すると、全ての回答が全文表示されます。

関連するQ&A