sed 代替文字列で '(一重引用符) をエスケープします。

sed 代替文字列で '(一重引用符) をエスケープします。

サーバー全体でいくつかのiptables変更を実行するスクリプトがあります。スクリプトには、文字列を見つけてその行の前にiptablesルールを挿入するsedコマンドがあります。

私が経験している問題は、私が編集しているファイルがyamlファイルで、その行に「and」がなければならないことです。

挿入されたコンテンツから 'を削除すると機能します。

$ sed 's/.*output_snat_lo.conf:.*/- -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1\n&/' file.yaml


     - '-t nat -A POSTROUTING -s 192.168.1.25/32 -d 10.0.0.1 -j SNAT --to-source 172.1.1.1'
     - -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1
  output_snat_lo.conf:

ただし、スラッシュを使用してエスケープするか二重引用符の中に入れると、スラッシュを含む二重引用符は印刷できませんが、代わりに無効なフラグを送信するオプションが提供されます。

これが私が挿入する内容です。

- '-t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1'\n&/' file.yaml

どのような提案/ヒントがありますか?前にもこんなことをしたことがあるようですが、どうしたのか覚えていません。

答え1

正規表現に入れたい一重引用符を閉じ、一重引用符をエスケープしてからもう一度開きます。

$ echo "a'b" | sed 's/'\''/X/'
aXb

$ echo "aXb" | sed 's/X/'\''/'
a'b

答え2

sedでは脱出する必要はありません。'そこには特別な意味はありません。 bashでエスケープする必要があります。

$ sed -e "s/'/singlequote/g" <<<"'"
singlequote

ここでは、二重引用符はbashから一重引用符を保護しますが、sedはこれをうまく処理することがわかります。一重引用符を切り替えると、次のことが発生します。

$ sed -e 's/'/singlequote/g' <<<"'"
>

bourne(all?)のようなシェルの奇妙なこと'"'二重引用符で囲むと、特別な意味はありません。観察する:

$ echo 'isn'"'"'t this hard?'
isn't this hard?

他の回答に示すように、バックスラッシュを使用してエスケープすることもできます。しかし、あなたは必ずしなければなりません。去る古い一重引用符ブロックが機能します。したがって、これは可能に見えますが、次のようになります。

echo '\''

'最初の障害者文字の意味ではありません\

他のアプローチを取ることをお勧めします。sed式はコマンドライン引数として指定できますが、シェルからエスケープする必要があります。短いsed式をエスケープするのは悪くありませんが、式がかなり長く、特殊文字がたくさん含まれています。

コマンドラインでコマンドを指定する代わりに、コマンドをファイルsedに入れ、パラメータ呼び出しを使用してsedコマンドファイルを指定します。-fhttp://man7.org/linux/man-pages/man1/sed.1.htmlそれともman sed詳しく紹介します。これにより、sedコマンドはシェルが表示するものの一部ではなく(ファイル名のみが表示されます)、シェルエスケープジレンマが消えます。

$ cat t.sed
s/'*/singlequote(s)/g

$ sed -f t.sed <<<"' ' '''"
singlequote(s) singlequote(s) singlequote(s)

関連情報