概要
Linuxで、sedコマンドを使って行内の色々な箇所に文字を挿入する、ということをfor文を使って行う方法です。
他のコマンドにも応用できるかと思います。(もっとシンプルな方法がありそうですが...)
insert.sh(シェルスクリプトではなく、コマンドライン上にコピペでも実行できます)
# !/bin/bash
cat sequence.txt > sequence2.txt
for i in 15 12 9 6 3
do
echo "$(sed -E "s/(^.{$i})/\1-/g" sequence2.txt)" > sequence2.txt
done
## 3文字おきに "-" を挿入する
## sequence.txt -> ("-"挿入) -> sequence2.txt
もしくは
# !/bin/bash
cat sequence.txt > sequence2.txt
for i in 15 12 9 6 3
do
sed -E "s/(^.{$i})/\1-/g" sequence2.txt > temp.txt
cat temp.txt > sequence2.txt
done
rm temp.txt
実行結果
$ cat sequence.txt
xxxx5xxx10xxx15
xx3xx6xx9x12x15
xxxxAxxxxAxxxxA
xxAxxAxxAxxAxxA
$ ./insert.sh ; cat sequence2.txt
xxx-x5x-xx1-0xx-x15-
xx3-xx6-xx9-x12-x15-
xxx-xAx-xxx-Axx-xxA-
xxA-xxA-xxA-xxA-xxA-
解説
- 同じファイル名を利用して
sed -E "s/(^.{$i})/\1-/g" sequence2.txt > sequence2.txt
のようにすると普通、sequence2.txtの中身は空っぽになってしまいますが
echo "$(コマンド)" > sequence2.txt
とすることで、sequence2.txtが空っぽで出力されることなく、うまく上書きすることができます。
(そもそも空のデータが出力されるのは、> sequence2.txt
実行時、sed
より先にまずsequence2.txtの中身を空にするという操作が行われているため(その結果、空のデータに対してsed
している)。
echo "$(コマンド)"
の中身は> sequence2.txt
よりも先に実行されるので、これによりsequence2.txtがうまく上書きされます)
-
sed
コマンドの中でfor文の変数**$i
**を利用できるようにするためには""
を利用する必要があります(''
を使うと変数ではなく、ただの文字列として認識されるため)
なお、同名ファイルへの出力に関しては他にもいろいろな方法があるようなので、興味あれば以下のリンクを参照ください。(1つ目のリンク)