yuu_nkjm blog
2009-11-27(Fri) [長年日記]
[Linux][command][sed][grep] grepとsedで文字列の一括置換
grepとsedを使って,特定のディレクトリ以下のファイルに含まれる文字列を一括置換したい.そこで,以下の手続きを実行するコマンドを発行する.
「秀丸のGrepして置換」の機能を想定した.findしてgrepしてxarg sedの方が汎用性高そうだったな.
- 特定のディレクトリ以下のファイルで,置換したい文字列を含むファイルのリストを生成する.
- 置換を実行したくないファイル名が含む文字列を指定することで,置換の対象としないファイルを取り除き,置換を実行すべきファイルのリストを生成する.
- 置換を実行したいファイルにおいて,置換を実行する.
簡単に言うと
grep -Erl '置換したい文字列' | \
grep -v "置換したくないファイル名" | \
xargs sed -i バックアップファイルのサッフィクス 's/置換したい文字列/置換後の文字列/g'
くどく説明すると
grep -Erl 'sedによる置換を適用したいファイルの中身に含まれる文字列' | \
grep -v "置換したくないファイル名が含む文字列" | \
xargs sed -i バックアップファイルのサッフィクス 's/置換したい文字列/置換後の文字列/g'
コマンドライン
最後の"-i"をつけると,バックアップファイルが作成されファイルが上書き編集される.
grep -Erl '置換したい文字列' | \
grep -v "置換したくないファイル名" | \
xargs -n 1 -i "バックアップファイルのサッフィクス" sed '1s/^/---------------{}--------------\n/' {} | \
sed 's/置換したい文字列/置換後の文字列/g'|lv
関連資料
- grep
-E, --extended-regexp PATTERNを拡張された正規表現として扱います。 -e PATTERN, --regexp=PATTERN PATTERNをパターンとして指定します-で始まるパターンを保護するために有効です。 -r, --recursive 各ディレクトリ下のすべてのファイルを再帰的に読み取ります。これは -d recurse オプションと等価です。 -l, --files-with-matches 通常の出力はせず、このオプションを指定しなかったときに出力される入力ファイルの名前を表示します。スキャン動作は最初のマッチで終了します。 -v, --invert-match 結果を反転し、マッチしなかった行を選択します。
grepのman
- sed
-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) g G Copy/append hold space to pattern space. s/regexp/replacement/ パターンスペースに対してregexpのマッチを試みる。マッチに成功すると、マッチした部分をreplacementに置換する。replacementは特殊文字である&を含むことができ、これはパターンスペースのマッチした部分を参照する。また\1から\9までの特殊エスケープを含むこともでき、これはregexpの副表現(sub-expression)にマッチした部分をそれぞれ参照する。
sedのman
sedで使用できる正規表現演算子
POSIX 1003.2で規定されているsedでは、以下の演算子が使用できます。
- .
- *
- ^
- $
- \(regexp\)
- \1 \2 \3 \4 \5 \6 \7 \8 \9
- [char-list]
- \{n,m\}
- \{n,\}
- \{n\}
- [:alnum:]
- [:alpha:]
- [:blank:]
- [:cntrl:]
- [:digit:]
- [:graph:]
- [:lower:]
- [:print:]
- [:punct:]
- [:space:]
- [:upper:]
- [:xdigit:]
GNU sedでは上記のものに加えて、以下のものが使えます。
付記: GNU sed 4.0.5ではオプション指定によりEREを使えるようになります(使えるEREはGNU のegrepと同じ)。
GNU sed 4.1.2 ではオプション指定によりPerl5互換の正規表現を使えるように なります(有効にしてコンパイルした場合)。また、正規表現演算子として\sと\Sが使えるようになっています。正規表現メモより
- https://www.google.co.jp/ ×1529
- https://www.google.com/ ×92
- http://t.co/MrrWtt0S ×10
- https://www.google.co.jp/ ×9
- https://www.bing.com/ ×9
- http://b.hatena.ne.jp/jiskay/sed ×7
- https://duckduckgo.com/ ×5
- http://search.fenrir-inc.com/?q=grep 置換&hl=ja&safe... ×2
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×2
- http://b.hatena.ne.jp/kazuph1986/ ×2
- https://www.google.com/webhp?hl=ja ×2
- https://www.google.co.in/ ×2
- https://www.google.co.jp/webhp?source=search_app ×2
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://docomo.ne.jp/cp/as-rslt.cgi?pno=1&key=linux... ×1
- http://search.fenrir-inc.com/?q=windows 文字列 置換 gre... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?q=sed 置換 例外&hl=ja&sa... ×1
- http://searches.globososo.com/search/web?fcoid=417... ×1
- http://www2.delta-search.com/?q=^M 一括削除 grep&s=web... ×1
- http://search.fenrir-inc.com/?q=grep置換 コマンドライン&hl=... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://docomo.ne.jp/cp/as-rslt.cgi?pno=1&key=linux... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- https://www.google.com/notebook/?hl=ja ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- https://www.google.com/ ×1
- https://www.google.com.ph/ ×1
- http://search.fenrir-inc.com/?q=grep 文字置換&hl=ja&sa... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://isearch.avg.com/search?q=grep 置換&sap=dsp&la... ×1
- http://docomo.ne.jp/cp/as-rslt.cgi?pno=1&key=sed 置... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://www.liveout.jp/search/ ×1
- http://pex.jp/search?Keywords=grep 置換 ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- https://www.google.com/search ×1
- http://www.netvibes.com/privatepage/1 ×1
- http://search.fenrir-inc.com/?q=grep 置換&hl=ja&safe... ×1
- http://search.fenrir-inc.com/?q=正規表現 grep置換&hl=ja&... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?q=grep 結果 編集 linux&h... ×1
- http://search.mobile.yahoo.co.jp/onesearch?p=linux... ×1
- http://search.plushome.adingo.jp/?Keywords=unix gr... ×1
- https://www.google.com/cse?cx=partner-pub-930063932... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?q=linux file grep 置換... ×1
- https://www.google.com.au/ ×1
- grep 置換 ×417 / grep sed ×111 / linux grep 置換 ×36 / sed grep ×35 / sed 一括置換 ×19 / grep置換 ×15 / grep 置き換え ×14 / sed 置換 ×9 / grep sed 置換 ×9 / unix grep 置換 ×6 / grep 文字置換 ×5 / grep xargs sed ×4 / unix grep 置換 sed ×4 / ファイルの中身の文字列を再帰的に置換 ×4 / grep 置換 linux ×4 / grep 一括置換 ×4 / linux sed 置換 正規表現 subexpression ×4 / sed 一括 ×3 / Ruby Grep置換 ×3 / grep 文字列変更 ×3 / man sed ×3 / grep リスト 置換 ×3 / grep 結果 cut ×3 / xargs grep sed ×3 / 文字列 置換 linux grep ×3 / grep sed 一括置換 ×3 / sed grep 一括置換 ×3 / ruby grep 置き換え バッチ ×3 / シェル grep 置換 ×3 / grep ruby find 文字列 置換 ×3 / "grep" "sed" ×2 / grep 一括返還 ×2 / linux tee ×2 / grep コマンド 置換 sed ×2 / regexp の副表現 ×2 / 秀丸 grep 同じ文字列 ×2 / shell grep 置換 ×2 / シェル 置換 一括 ×2 / grep sed 置換 ファイル ×2 / GREP置換 ×2 / grep 文字列 編集 ×2 / grep 含まれる 文字列 置換 ×2 / grep linux sed ×2 / 一括置換 sed ×2 / grep sed xarg ×2 / sed 副表現 ×2 / sed 特殊文字 置換 ×2 / 一括置換 sed コマンド ×2 / ruby grep 置換 ×2 / sed 一括 置換 ×2 / linux 置換 grep ×2 / linux grep 置き換え ×2 / シェルスクリプト 一括置換 ×2 / SED GREP ×2 / grep sed linux ×2 / sed grep 文字列置換 ファイル ×2 / grep 文字列 置換 ×2 / grep sed xargs 解説 ×2 / sqlite 置き換え 一括 ×2 / linux grep 置換 対象のファイル ×2 / sed 文字列 置換 ×2 / Linux grep 一括 置換 ×2 / ruby 一括置換 bat grep ×2 / 正規表現 grep sed ×2 / grep sed 使い方 ×2 / sed 一括置換 grep ×2 / sedで / ×2 / grep 置換 再起的 ×2 / UNIX grep sed ×2 / sed 全置換 ×2 / man grep 置換 ×2 / Grepしてシェルを生成 ×2 / grep 置換 manpage ×2 / grepして置換 ×2 / linux grep sed ×2 / grep 置換 windows ×2 / sed 各ファイル 置換 ×2 / sed 置換 punct ×2 / linux sed 置換 スペース 有効 ×2 / 一括置換 solaris ×2 / sed 置換 副表現 ×2 / sed 置換 例外設定 ×2 / linux grep 結果 置換 ×2 / grep 置換 文字列 ×2 / linux 再帰 文字列 置換 grep sed ×2 / grep linux 置換 ×2 / tex 一括置換 ×2 / grep 置換 sed ×2 / linux grep 置換 cシェル ×2 / sed grep 置換 ×2 / Grep 置換 ×2 / grep unix -A ×2 / linux sed grep ×2 / sed 特殊文字 ×2 / xml sed grep ×2 / windows sed ×2 / grep 結果行 削除 ×2 / linux 文字列 grep 置換 ×2 / sed 置換 フォルダ ×2 / sedコマンド 副表現 ×2