※ centOSでやってるので、他のOSの方は同じ挙動をするかわかりません
❯ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
本文
sedコマンドは、テキストファイルに行を追加したり、文字を置き換えたりできる
suzuki.txt
わたしは
すずきです
# 正規表現を用いた置き換え
$ sed -e "s/すずき/さとう/" suzuki.txt
わたしは
さとうです
# 行の追加(1行目の後に追加)
$ sed -e "1a さとうではなく" suzuki.txt
わたしは
さとうではなく
すずきです
前者ではすずき
をさとう
に置き換えたが、この文字の先頭に半角スペースを2つ入れたい場合は以下の通り
(別に変数に入れる必要はないが、わかりやすいので使用する)
$ indent=" "
$ sed -e "s/すずき/${indent}さとう/" suzuki.txt
わたしは
さとうです
これは別に迷うことはない。
ちなみに、インデントだけを入れて、すずき
をそのままにしたい場合はこんな感じ
$ indent=" "
$ sed -e "s/\(すずき\)/${indent}\1/" suzuki.txt
わたしは
すずきです
注意すべき点は以下の2つだろう。
-
()
はエスケープしないといけない(「\(
」や「\)
」としないといけない) -
$1
ではなく、\1
になっている
rubyなどの正規表現に慣れている人は、ここを間違いやすい(てか自分がそうだった)。
一方で、後者の「行の追加」場合は「\
」をうまく使わうことで実現ができる
# 単純にスペースを入れるだけだとうまくいかない
$ sed -e "1a さとうではなく" suzuki.txt
わたしは
さとうではなく
すずきです
# 文字列を「\」から始めて、そこから任意の数だけスペースを入れるとうまくいく
$ sed -e "1a \ さとうではなく" suzuki.txt
わたしは
さとうではなく
すずきです
上記の例に変数を使わなかったのには理由があって、変数を使いたい場合は「\」自体をエスケープしないといけない
ので、特に注意が必要。
今回の記事で一番言いたかったことはここ(意外と調べても出てこない)。
$ indent=" "
# 「\」が一つだけだと「$のエスケープ」という意味になってしまい、うまくいかない
$ sed -e "1a \${indent}さとうではなく" suzuki.txt
わたしは
${indent}さとうではなく
すずきです
# 「\」を使用して、「\」自身をエスケープするとうまくいく
$ sed -e "1a \\${indent}さとうではなく" suzuki.txt
わたしは
さとうではなく
すずきです
以上、sedコマンドで、先頭にスペースをつけたい時に注意すべき点でした。