0

これは簡単なはずですが、私はそれから抜け出すことができません:

UNIX コマンドラインを使用して、.php ファイル内のテキストを置き換える必要があります。

using: sudo sed -i '' 's/STRING/REPLACEMENT/g' /file.php(Mac Os X で実行されるため、-i の後の引用符が必要です)

文字列: を次の['password'] = "";ように置き換える必要があります: ['password'] = "$PASS"; $PASS は変数なので、入力されます。

私は次のようなものになりました:

sudo sed -i '' 's/[\'password\'] = ""\;/[\'password\'] = "$PASS"\;/g' /file.php

しかし、私はUNIXが初めてなので、何をエスケープすればよいかわかりません...

何を変更する必要がありますか?ありがとう!

4

2 に答える 2

1

残念ながら、sed は、sed とシェルにとって「特別な」さまざまな文字を含む可能性のある変数を確実に処理できません。これには awk を使用する必要があります。たとえば、gensub() には GNU awk を使用します。

gawk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file

PASS にスラッシュが含まれているが awk が気にしない場合に、sed がどのように失敗するかを以下で確認してください。

$ cat file
The string: ['password'] = ""; needs to be replaced

$ PASS='foo'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
The string: ['password'] = "foo"; needs to be replaced

$ PASS='foo/bar'
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file
The string: ['password'] = "foo/bar"; needs to be replaced
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file
sed: -e expression #1, char 38: unknown option to `s'

単一引用符で区切られた awk スクリプト内で単一引用符を表すには、\047またはその他の方法 (たとえば、必要に応じて)を使用する必要があります。'"'"'

gensub() を使用しない awks では、代わりに gsub() を使用します。

awk -v pass="$PASS" '{pre="\\[\047password\047] = \""; gsub(pre,pre pass)}1' file
于 2013-08-26T12:30:02.843 に答える
0

sedで変数を展開したい場合は、二重引用符を使用する必要があるため、次のようになります

sed -i... "s/.../.../g" file

つまり、これらの一重引用符をエスケープする必要はありません。また、グループ参照を使用して入力を節約することもできます。あなたが試すことができます:

sudo sed -i '' "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" /file.php
于 2013-08-26T11:14:57.287 に答える