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でよく使う(と思われる)基本的なことは以上!