1
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 1 year has passed since last update.

sedコマンドで、先頭にスペースをつけたい時の注意点など

Last updated at Posted at 2022-08-31

※ 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コマンドで、先頭にスペースをつけたい時に注意すべき点でした。

1
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
1
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?