sed sh 脱出問題

sed sh 脱出問題

目標にとても近づいていますが、今は詰まっています。

phpmyadmin設定ファイルを簡単に編集するために自動化されたスクリプトを作成しようとしています。

cat /usr/share/phpmyadmin/config.sample.inc.php |sed s^//\ \$cfg\\[\'Servers\'^\$cfg\\[\'Servers\'^

// 基本的に。で始まるすべての行を削除しようとしています// $cfg['Servers']。上記の行はトリックを行いますが、私がしなければならないすべてのエスケープ作業に満足していません。私はこのsedコマンドの何百ものバリエーションを試しましたが、他のすべての文字をエスケープすることがこれまでに機能する唯一の方法のようです。

sudo sh -cもう一つの障害:最終的には上記のコマンド文字列を昇格シェル(使用)を介して渡したいと思います。たとえば、次のようになります。

sudo sh -c "cat /usr/share/phpmyadmin/config.sample.inc.php |sed s^//\ \$cfg\\[\'Servers\'^\$cfg\\[\'Servers\'^  >/usr/share/phpmyadmin/config.inc.php"

ただし、これを試みるたびに次のエラーが発生します。

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

だから私の質問は次のとおりです。sedあまりにも多くの文字をエスケープする必要がないように表現を単純化できますか?コマンドに違反しないように、表現を昇格シェルに渡すにはどうすればよいですかsed s

私の主な問題は、上昇したシェルに二重引用符で区切られた文字列が渡され、sed文字列に一重引用符が含まれていることです。過去には通常、両方を使用するコマンドがなかったので、一方を別のものに置き換えることができました。

ベストアンサー1

スクリプトを二重引用符で正しく囲むと、スペースと一重引用符をエスケープする必要はありません。

sed "s^// \$cfg\['Servers'^\$cfg['Servers'^" file

また、代替項目の角かっこをエスケープする必要はありません。正規表現の括弧はエスケープする必要があります。そうでなければ、特殊な正規表現記号として理解されるからです。

エスケープを最小限に抑えるための最善の方法は、sedコマンドをファイルに入れて、二重引用符を必要とせず、$シェル拡張で置き換えるときにドル記号を保護する必要がないようにすることです。

servers.sed:

s^// \$cfg\['Servers'^$cfg['Servers'^

次に、次のように実行します。

sed -f servers.sed file

最後の形式は、上昇したシェルでも使いやすいです。

sudo sh -c 'sed -f servers.sed file > newfile'

おすすめ記事