35

私は取得しています

sed: -e expression #1, char 22: unterminated `s' command 

私のスクリプトに問題がありますか?また、「oldstring」には特殊文字があります

#!bin/bash
oldstring='<script>"[oldscript]"</script>'
newstring='<script>"[newscript]"</script>'
grep -rl $oldstring /path/to/folder | xargs sed -i s/$oldstring/$newstring/g
4

5 に答える 5

13
grep -rl $oldstring . | xargs sed -i "s/$oldstring/$newstring/g"
于 2014-10-28T06:26:22.650 に答える
6

GNU の人たちは、grep に再帰的なファイル検索を導入したとき、本当にめちゃくちゃでした。grep は、ファイル内の正規表現を見つけて一致する行を出力するためのものです (g/re/p 覚えていますか?) ファイルを見つけるためではありません。ファイルを検索するための非常に明白な名前を持つ完全に優れたツールがあります。UNIX のモットーである「1 つのことを正しく行う」はどうなったのでしょうか。

とにかく、従来のUNIXアプローチを使用してやりたいことを行う方法は次のとおりです(テストされていません):

find /path/to/folder -type f -print |
while IFS= read -r file
do
   awk -v old="$oldstring" -v new="$newstring" '
      BEGIN{ rlength = length(old) }
      rstart = index($0,old) { $0 = substr($0,rstart-1) new substr($0,rstart+rlength) }
      { print }
   ' "$file" > tmp &&
   mv tmp "$file"
done

sed や grep の代わりに awk/index() を使用することで、古い文字列または新しい文字列に表示される可能性のあるすべての RE メタ文字をエスケープする必要がなくなり、sed 区切り文字として使用する文字を見つけ出すことができます。古い文字列または新しい文字列に表示されず、必要な文字列を含むファイルに対してのみ置換が行われるため、grep を実行する必要はありません。以上のことをすべて述べた後、ファイルを変更せずにファイルのタイムスタンプを変更したくない場合は、mv を実行する前に tmp と元のファイルで diff を実行するか、前に fgrep -q をスローします。おかしい。

警告: 上記は、改行を含むファイル名では機能しません。それらをお持ちの場合は、お知らせください。それらの処理方法をご案内します。

于 2013-04-11T12:53:39.207 に答える