(51) sedでファイル中の文字列を置換する。

投稿者: | 2017年7月17日

今更だがちょっと迷ったので備忘録

■やりたかったこと

$c_tk_y[$r][$c2]=10;

$c_tk_y[$r][$c2]=13;
に変えたかった。

■実現方法

エスケープ文字を考慮せずに書けばこういうこと。

sed -i -e "s/$c_tk_y[$r][$c2]=10;/$c_tk_y[$r][$c2]=13;/g" *.php

この中で「$」「[」「]」の3文字は正規表現でエスケープが必要なので、
エスケープ文字を考慮して書けばこうなる。

sed -i -e "s/\$c_tk_y\[\$r\]\[\$c2\]=10;/\$c_tk_y\[\$r\]\[\$c2\]=13;/g" *.php

とすればよい。

因みに上で使用したオプションは?
-i : ファイルを上書き保存する。
-e : この直後にコマンドを書くという指示。-e を複数書けば複数コマンドを繋げて書ける。

参考: http://qiita.com/katsukii/items/1c1550f064b4686c04d4

■応用#1

SyntaxHighliterを導入前は、ブログ上のソースコードの装飾に spanタグをせっせと埋め込んでいた。
SyntaxHighliterを使うようになったため、これを一括で削除したい。

sed -e "s/<span[^>]*>//g" -e "s/<\/span>//g" tmp.txt

一つ目の s/<span[^>]*>//g は以下の通り。
<span : <spanで始まること。
[^>]* : >ではない文字 0個以上の繰り返しであること。
> : 最後は > で終わること。

■応用#2

JavaScriptファイルをアップロードした後、文字数を少なくするために、
2行目: 行頭の空白文字を削除
3行目: 「//」から始まるコメント削除
4行目: 改行文字削除
5行目: 空行削除
6行目: 連続した空白文字を一つにまとめる
を実行したい。

TRG=xxxxxx.js
sed -i -r -e "s/^\s+//g" $TRG
sed -i -e "s%//.*$%%g" $TRG
sed -i -e "/^$/d" $TRG
sed -i -e ':loop; N; $!b loop; s/\n//g'  $TRG
sed -i -r -e "s/\s+/ /g" $TRG

因みに上で使用したオプションは?
-r : 拡張正規表現を使うことを宣言。ここでは「+」が拡張正規表現だ。{1,}で置き換え可能だが…

※上記の 3行目は注意!
 URLとして書かれた「//」も削除してしまう… 要改善

■謝辞

有用な情報をありがとうございます。m(_ _)m


カテゴリー: sed

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です