読者です 読者をやめる 読者になる 読者になる

sedで行追加するときに行頭にスペースをいれる方法。

ググっても日本語サイトでは事例が見当たらなかった。スペースを削除する事例ばかり。stackoverflowでやり方を見つけた。

stackoverflow.com

今回は、特定の文字列を持つhtmlファイルに対して、タグを一行挿入しかつインデントを揃えるということをsedコマンドでやりたかった。

・・・省略・・・
<ul>
    <li>Hello</li>
</ul>
・・・省略・・・

例えば上記のhtmlコードを含むファイルが特定のフォルダ内に複数あったとして、「<li>Hello</li>」の一行下に「<li>World</li>」を追加し、さらにインデントを揃える場合は、以下のsedコマンドを使う。

grep -r 'Hello' sample_dir | awk -F':' '{print $1}' | while read line
do
sed -i -e '/Hello/a \    <li>World</li>'  $line
done

要点は「a \」の部分。「a」だけだと文字列は追加できるけどスペースは追加できない。「\」を指定することによってスペースを追加することができる。
実はManにも記載されているのだが、stackoverflowの回答を見るまでは改行挿入用なのかと誤解していた。

a \
text
text を追加する。text に改行を含める場合は、各改行の前にバックスラッシュを置く。

https://linuxjm.osdn.jp/html/GNU_sed/man1/sed.1.html

便利。