Linuxのsedコマンド | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

GWが終わって平日2日。

さっそく仕事に追われています(´・ω・`)笑

 

今回は、仕事で出てきた、sedコマンドについて。

コマンドの存在は知ってたんですが、実際使おうとすると奥が深くて難しかったので、

コマンドの使い方を簡単にまとめてみます。

 

sedコマンドとは…

指定したファイルへの、文字置換や挿入といった編集処理を、標準出力してくれるコマンド。

 

コマンドの基本構文は以下の通り。

 sed [OPTION]... {script-only-if-no-other-script} [input-file]...

 

sed以外は全部オプション…なので分かりづらいが、

よく使われるオプションについて、以下に例示していく。

 

環境

1.文字列置換

2.文字列追加

3.行削除

 

試行環境

以降、CentOS7環境で試してみる。

また、以下のようなテスト用のファイルを用意した。

 $ cat test.txt
aaa=bbb
ccc=dddddd
# これはテストです
abc"xxx" $ yyy
aaaa

 

1.文字列置換

test.txt内の文字列"aaa"を、"AAA"に置換して標準出力する。

 ・標準出力の際は、「-e "スクリプト"」オプションを利用する。

 ・スクリプト部分を、「s/置換前の文字列/置換後の文字列/」とすると、置換の指示となる。

 ・最後に、処理対象のファイル(今回はtest.txt)を指定する。

$ sed -e "s/aaa/AAA/" test.txt
AAA=bbb   
←aaa=bbbがAAA=bbbに変わった
ccc=dddddd
# これはテストです
abc"xxx" $ yyy
AAAa     
←aaaaがAAAaに変わった

 

※通常、上記例のコマンドを実行すると、あてはまる最初の文字列だけが置換されるようです。

(なぜか私の環境ではすべて置換された…。原因はよく分かっていません💦)

あてはまる最初の文字列だけでなく、すべて置換したい場合は、通常、

sed -e "s/aaa/AAA/g" test.txt

などのように、「g」をつけてやる必要があるらしいです。

 

 

上記コマンドにより、出力結果は「aaa」が「AAA」に置き換わっている。

が、あくまでも処理結果を標準出力しているだけのため、実際のファイルが上書きされるわけではない。

 

置換後のファイルを保存したい場合は、

 ①別ファイルを作成して保存する

 ②上書き保存する

の2パターンが考えられる。

 

①の場合は、出力結果を、別ファイルに対して出力するようにすればよい。

$ sed -e "s/aaa/AAA/" test.txt > test2.txt
$ cat test2.txt
AAA=bbb
ccc=dddddd
# これはテストです
abc"xxx" $ yyy
AAAa

 

②の上書き保存をしたい場合は、「-e」オプションではなく、「-i」オプションをつける。

$ sed -i "s/aaa/AAA/" test.txt  ←結果は標準出力されない
$ cat test.txt  ←対象ファイルが上書きされている
AAA=bbb
ccc=dddddd
# これはテストです
abc"xxx" $ yyy
AAAa

 

 

2.文字列の追加

続いて、文字列の追加・挿入方法を紹介する。

なお、以降は「-e」オプションにより標準出力させているのみだが、

1.文字列置換で書いた通り、「-e」を「-i」に変えることでファイルに上書き保存も可能である。

 

文字列の追加には、

「-e "スクリプト"」オプションのスクリプト部分で、「a」または「i」を利用する。

 

「-e "追加場所a 追加文字列"」とした場合、追加場所の後ろに文字列を追加する。

「-e "追加場所i 追加文字列"」とした場合、追加場所の前に文字列を追加する。

追加場所は、1行目の後ろ/前に追加したいなら「1」、5行目の後ろ/前なら「5」など、行番号を指定する。

また行末に追加したい場合は、「a」オプションを利用のうえ、「$」を指定する。

 

例:

$ sed -e "1a test add" test.txt   ←1行目の後ろに、「test add」という文字列を追加する
aaa=bbb
test add                  
←追加された
ccc=dddddd
# これはテストです
abc"xxx" $ yyy
aaaa

 

先頭に入れる例:

$ sed -e "1i test add" test.txt   ←1行目の前(つまり先頭)に追加する
test add                  ←追加された

aaa=bbb
ccc=dddddd
# これはテストです
abc"xxx" $ yyy
aaaa

 

行末に入れる例:

$ sed -e "\$a test add" test.txt   ←行末に追加する
aaa=bbb
ccc=dddddd
# これはテストです
abc"xxx" $ yyy
aaaa
test add                  
←追加された

 

$(記号)を使うときの注意点として、

 ・スクリプトを""(ダブルクォーテーション)で囲っている場合:

        \マーク(エスケープ文字)を記号の直前に入れる

 ・スクリプトを''(シングルクォーテーション)で囲っている場合:

        \マークを入れない

という違いがある。

シングルクォーテーションのほうが楽にも思えるが、

例えば「abc$123」という文字列を入れたい場合、シングルクォーテーションでは、$が単なる文字ではなく記号の意味として解釈されてしまうため、注意が必要である。

 

3.行削除

sedコマンドにより、指定した行を削除することもできる。

削除には、「-e "スクリプト"」オプションのスクリプト部分で、「d」を指定する。

また対象の行は、文字列追加の時と同じルールで、行番号を指定する。

$ sed -e "\$d" test.txt ←最終行を削除する
aaa=bbb
ccc=dddddd
# これはテストです
abc"xxx" $ yyy

 

削除対象の行は、「,(コンマ)」で区切ることで、連続した複数行の指定も可能である。

$ ed -e "2,4d" test.txt ←2行目~4行目を削除する
aaa=bbb
aaaa

 

 

sedでよく使う(と思われる)基本的なことは以上!