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

投稿者: | 2017年7月17日

2,526 views

この記事は最終更新から 604日 が経過しています。

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

■やりたかったこと

$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 を複数書けば複数コマンドを繋げて書ける。

因みに上で使用したコマンドは?
s : パターンを指定して置換する。
g : 複数マッチした場合はすべてを処理対象とする。

参考: 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個以上の繰り返しであること。
> : 最後は > で終わること。

因みに…
行末を \ でつなげば複数行に分けて書ける。

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

■応用#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として書かれた「//」も削除してしまう… 要改善

因みに…
行末を \ でつなげば複数行に分けて書ける。
この場合、-i -r とファイル名はまとめて一回の記述でよい。

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

■参考情報

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

https://atmarkit.itmedia.co.jp/ait/articles/1610/13/news015.html

■備忘録 : よく使うオプション

-i : ファイルを上書き保存する。
-e : この直後にコマンドを書くという指示。 -e を複数書けば複数コマンドを繋げて書ける。
-n : 処理対象でない部分は出力せず。(未指定時、未処理の行なども出力される。)

■備忘録 : よく使うコマンド

s : パターンを指定して置換する。
g : 複数マッチした場合はすべてを処理対象とする。。


カテゴリー: sed

コメントを残す

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