令和元年/ 2019-12-12 23:43
Linux, Replace, grep, sed, 一括置換, 2019.09.27

( & は全体マッチという命令なのでエスケープする必要ある )
egrep -Irl '/b766198c_1\?t=btn&bw=410&bh=520' | xargs sed -i'' -E 's/\/b766198c_1\?t=btn&bw=410&bh=520/\/b766198c_4?t=btn\&bw=410\&bh=620/g'


(指定した次の行を削除)
( {n;d;} を使う )
( -E で正規表現を有効にする )
( -e でスクリプト(コマンド)を有効にし {n;d;} が効くようにしている )
find ./ -type f | xargs egrep ' *<section *class="com(_foot)?_pnkzbox"[^>]*> *'
find ./ -type f | xargs egrep -l ' *<section *class="com(_foot)?_pnkzbox"[^>]*> *'
find ./ -type f | xargs egrep -l ' *<section *class="com(_foot)?_pnkzbox"[^>]*> *' | xargs sed -i'' -E -e '/ *<section *class="com(_foot)?_pnkzbox"[^>]*> */{n;d;}'


(指定した行に追加する)
( -e を使う )
find ./ -type f | xargs egrep -l ' *<section *class="com(_foot)?_pnkzbox"[^>]*> *' | xargs sed -i'' -E -e '/ *<section *class="com(_foot)?_pnkzbox"[^>]*> */a <?php include "detail_breadcrumb.html"; ?>'





(Sygwinだと、xargs sed -i'' としないとダメ)
(xargs egrep -l で絞り込むと、置換したものだけが更新されるので検証に便利)
(文字にシングルクォーテーションが含まれる場合はダブルクォーテーションでくくる)
find htdocs -type f | egrep '\.(php|html)$' | xargs egrep -l  "20'トップ" | xargs sed -i'' -E "s/ *20'sトップ */<?php _h(_breadcrumb_name_1()); ?>/g"


(( BSD ))
(対象ファイルを確認)
find ./ -type f | egrep '\.html$' | egrep -v '[0-9]{4}' | xargs egrep 'a +href="\/sp(\/(#|ce|cr|g|b|p|d|s|r|a)[^"]+)"'

(とりあえず1つやってみる)
(\1で正規表現の値使える。
(BSDの場合でバックアップいらないときも、-i '' のように指定しないとダメ)
(ダブルクォーテーションや、シングルクォーテーションのエスケープは無いみたいなので -E '' か -E "" で工夫しないとダメ)
(-E オプションを使わないと正規表現が有効にならない)
find sp/crowding.html -type f | xargs sed -i '' -E 's/a +href="\/sp(\/(#|ce|cr|g|b|p|d|s|r|a)[^"]+)"/a href="\1"/g'

(全部やる)
find ./ -type f | egrep '\.html$' | egrep -v '[0-9]{4}' | xargs sed -i '' -E 's/a +href="\/sp(\/(#|ce|cr|g|b|p|d|s|r|a)[^"]+)"/a href="\1"/g'




(( LINUX? ))
1.対象を確認
find */admin_lp/c_edit.html -print | egrep '\.html$' | xargs grep '\["width"\] = "110";'

    find -type f してもディレクトリを評価してしまうので、egrep '\.html$' している。


2.まずは一枚やってみる。
find hoge/admin_lp/c_edit.html -print | xargs grep '\["width"\] = "110";'
find hoge/admin_lp/c_edit.html -print | xargs sed -i.20110531_1221 's/\["width"\] = "110";/\["width"\] = "165";/g'

3.対象のファイルを確認する
find */admin_lp/c_edit.html -print | xargs grep -l '\["width"\] = "110";'

4.置換する(バックアップが作成されるので安心)
find */admin_lp/c_edit.html -print | xargs grep -l '\["width"\] = "110";' | xargs sed -i_20110531_1221 's/\["width"\] = "110";/\["width"\] = "165";/g'

//----findを使わない場合は、フルパスでかかないとダメ!
//対象を確認する。
grep href=\"/contact/\" /home/usr/*/*/*.html

//パスを確認
grep -l href=\"/contact/\" /home/usr/*/*/*.html

//置換する
grep -l href=\"/contact/\" /home/usr/*/*/*.html | xargs sed -i_20110801_1652 's/href=\"\/contact\/\"/href=\"\/consultation\/\"/g'
//----