*.txt
共通形式のファイルが何百ものあります。
ファイル内の特定の場所にカンマを挿入できます。次のコードを一般化して*.txt
ディレクトリ内のすべてのファイルに対して複数の場所に適用するにはどうすればよいですか?
sed -i 's/^\(.\{4\}\)/\1,/' blank.txt
たとえば、位置4、8、22などにカンマを挿入します。
たぶんこんなことはありませんか?
for i in *.txt; do
sed -i 's/^\(.\{4\}\)/\1,/' $i
done
答え1
中一般的なあなたがこれをすることができる方法:
sed 's/./&,/4' <in >out
これにより、少なくともその文字数を含むすべての入力行の4番目の文字に出力時にカンマが追加されます。
そして私のアドバイスを受け入れるならば、一般的に次のようにしなければなりません。いいえ提供されているオプション-i
のいずれかに切り替えるには、スイッチを使用してください。sed
答え2
一番右から始める:
sed -i 's/./&,/22;s/./&,/8;s/./&,/4' ./*.txt
それ以外の場合、最初の置換は2番目の置換のオフセットに影響します。しかし、いつでも説明できます。
sed -i 's/./&,/4;s/./&,/9;s/./&,/24' ./*.txt
答え3
「位置4、8、22で」と言う場合、sedは「位置3、7、21以降」を意味する。既存のテキストを挿入してそのままにしようとします。
これ? :
sed -i -r "s/^(.{3})/\1,/;s/^(.{7})/\1,/;s/^(.{21})/\1,/" $(dirname "$0")/blank.txt
-i = --in-place つまり既存のファイルから直接変更、-r = 正規表現、 \1 = 角かっこの間の「グループ」を参照、 $(dirname "$0") = 現在のディレクトリに保持
ファイル内の特定の場所にスペースの代わりにタブを設定し、単一のスペースに行を区切るには、sedで次のように使用できます。
sed -i -r "s/^(.{10})./\1\t/;s/^(.{20})./\1\t/;s/^(.{30})./\1\t/" $(dirname "$0")/blank.txt
11、21、31の位置の文字をタブ文字(この場合は単一のスペース)に置き換えます。生成された列内のスペースは変更されません。
それでも、テキストエディタで列が正しく整列/表示されないという印象を受けます。エンコードされたタブにはバグはありませんが、通常はテキストエディタのデフォルト設定でタブ設定を調整する必要があります。たとえば、Geany - >設定 - >エディタ - >インデント - >タブの幅は4ではなく8です。
(後者は元の質問とは若干異なります...)