0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

for文を使って何度もsedコマンドを実行する方法

Last updated at Posted at 2020-07-14

概要

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-

解説

  1. 同じファイル名を利用して
     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がうまく上書きされます)



  2. sedコマンドの中でfor文の変数**$i**を利用できるようにするためには""を利用する必要があります(''を使うと変数ではなく、ただの文字列として認識されるため)

なお、同名ファイルへの出力に関しては他にもいろいろな方法があるようなので、興味あれば以下のリンクを参照ください。(1つ目のリンク)

  1. に関して
    bashでファイルを処理して結果を同じファイルに上書きする

    同じ名前のファイルにリダイレクト

  1. に関して
    【bash】 「"」、「'」、「`」の違い - どちらかというとごはん派
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?