2016-06-13 2 views
2
printf '%s' 'abc' | sed 's/./\\&/g'      #1, \a\b\c 
printf '%s' "`printf '%s' 'abc' | sed 's/./\\&/g'`"  #2, &&& 

に変換し、それが\a\b\cを印刷する必要がありますので、私たちは、printf '%s' "\a\b\c"を持っています。 私の質問です:なぜ2番目のスクリプト&&&を印刷しますか?二重のバックスラッシュを単一のバックスラッシュ二バッククォート内の式は<code>abc</code>返し

注:2つ目のスクリプトの作業(print \a\b\c)は、各バックスラッシュの前に別のバックスラッシュを付けることで取得できますが、なぜそれが必要なのかわかりません。

つの関連質問: why does this single quoted string get interpreted when it's inside of a command substitution

+0

'printf '%s'" $(printf '%s' 'abc' | sed 's /./\\&/g') ''細かいbtwを動作させます。 – anubhava

+0

@anubhavaうわー、本当にそうです。だから、バックスティックは私が推測するいくつかの奇妙な副作用があります。 – pdg

+0

はい、逆戻りは吸います。実際に使用する理由はありません。あなたの問題に関する詳細はこちらhttp://mywiki.wooledge.org/BashFAQ/082 – 123

答えて

2

これは、バックティックと$(cmd)コマンド置換との違いを示すための良い例です。

置換の古いスタイルバッククォートフォームを使用する場合は、バックスラッシュ は、「$」、「`」、または「\」が続いたときを除き、その文字通りの意味を保持します。 バックスラッシュの先頭にない最初のバックティックは、コマンド を終了します。 "$(COMMAND)"形式を使用している場合は、 の間のすべての文字がカッコで囲まれています。特別に扱われるものはありません。

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

だからあなたの例を見て取り、私はecho代わりのprintfを使用:

kent$ echo 'abc' | sed 's/./\\&/g' 
\a\b\c 

kent$ echo -E "`echo 'abc' | sed 's/./\\&/g'`" 
&&& 

kent$ echo -E "$(echo 'abc' | sed 's/./\\&/g')"      
\a\b\c 

あなたが見ることができ、バックティックコマンド置換は、このように、単一\としてあなた\\を作りました一緒に続いて&\&(リテラル&

\a\b\cを印刷できるように、バックスラッシュエスケープの解釈を無効にするためにecho -Eを使用しました。

1

ので、2行目:

あなたが言っている:次に

printf '%s' 'abc' -> 'abc' 

置き換える:

'abc'| sed 's/./\\&g' -> &&& 

The s mean substitute 
. mean one character 
\\& by a char & 
g mean multiple occurrence on the line 

だから、あなたが言っています:

は同じライン

説明\\\&の上&複数のタイムで、ABCの各文字に置き換えます。最後に

Two backslashes become a single backslash in the shell which then in sed escapes the forward slash which is the middle delimiter. 

\\& -> \& (which makes the forward & a regular character instead of a delimiter) 

Three of them: The first two become one in the shell which then escape the third one in sed 
\\\& -> \\& 

!あなたは(そのようなシェルスクリプトのような)環境でこのコマンドを入力しているので、

あなたはそれをエスケープする必要がある理由「が2回」でダブルを解釈する:あなたが命じることを忘れてはいけないことはバッククォートの下にあります一度引用符で囲まれた文字列。その後、サブシェルによって再び解釈されます。

から:

Why does sed require 3 backslashes for a regular backslash?

+0

申し訳ありません、それはタイプミスです、私はそれを修正しました。 – pdg

+0

二重バックスラッシュは一重引用符なので、私の質問の最初の場合のように、それをさらにエスケープする必要はありません。 – pdg

+0

私はちょうど私の答えを編集しました – Destrif

関連する問題