
複数の.php
ファイルがあり、文字列を含むすべての項目を置き換えたいです。
find: jQuery(function
replace: head.ready(function
以下を使って正しく行っていると思います。
find . -name '*.php' -exec sed -e 's/jQuery[(]function/head.ready[(]function/g' -i'.bak' {} \;
結局のところ、何が起こるのかは次のようjQuery(function
に置き換えられるということです。head.ready[(]function
(
止めれば逃げられると思ったんですけど[]
それじゃないんですよ。
誰でもどんな提案がありますか?
答え1
(
sed 正規表現の特殊文字ではありません。あなたはそれを脱出する必要はありません。
sed -e 's/jQuery(function/head.ready(function/g'
[(]
正規表現で意味するのは、単一の要素()のみを含む文字セットです。(
これを作成するための複雑な方法です(
。
[(]
代替テキストは3文字を意味します[(]
。代替テキストでは、括弧は特に意味がありません。
必要に応じて、関数をグループに配置して、関数名が重複するのを防ぐことができます。グループはバックスラッシュの角かっこで区切られます。
sed -e 's/jQuery(\(function\)/head.ready(\1/g'
交換した製品にも影響がありますjQuery(functionwithsuffix
。これを防ぐ簡単な方法は、拡張されたPerl正規表現を理解するツールを使用して、(?![^A-Za-z0-9_])
検索文字列の末尾に「次に英数字以外の文字が来る」という意味を使用できるようにすることです。 Perl正規表現では(
特別で、前にバックスラッシュが必要です。
perl -pe 's/jQuery\(function(?![^A-Za-z0-9_])/head.ready(function/g'
perl -pe 's/jQuery\((function)(?![^A-Za-z0-9_])/head.ready($1/g'
答え2
代替文字列で角かっこをエスケープする必要はありません。
sed -e 's/jQuery[(]function/head.ready(function/g'
答え3
(
はい使用する場合 sed の特殊文字拡張正規表現(むしろ)。
たとえばsed -e
失敗するでしょう不一致エラー、(何らかの理由で)括弧を避ける必要がありますが、以下を実行する必要がある場合sed指定されていないむしろ:
$ regex="\("; echo "...(..." | sed 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(
$ regex="\("; echo "...(..." | sed -e 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(
-E
この場合、オプション(または-r
、)でsedを使用する必要があります--regexp-extended
。
$ regex="\("; echo "...(..." | sed -E 's/'$regex'/_/g'
..._...
$ regex="\("; echo "...(..." | sed -r 's/'$regex'/_/g'
..._...