これら 2 つのコマンドの出力が異なるのはなぜですか?
cat config.xml|perl -ne 'print $1,"\n" if /([0-9\.]+):161/'
cat config.xml|perl -ne "print $1,"\n" if /([0-9\.]+):161/"
最初は一致したグループを期待どおりに印刷し、秒は行全体を印刷します。
二重引用符の中では、いくつかのものが置き換えられます ($variable、`command`、..)。一重引用符で囲まれている間は、そのまま残ります。
$ echo "$HOME"
/home/falsetru
$ echo '$HOME'
$HOME
$ echo "`echo 1`"
1
$ echo '`echo 1`'
`echo 1`
ネストされた引用符:
$ echo ""hello""
hello
$ echo '"hello"'
"hello"
$ echo "\"hello\""
"hello"
$
同じ結果を得るには、二重引用符をエスケープします。
cat config.xml | perl -ne "print \$1,\"\n\" if /([0-9\.]+):161/"
2つのこと:
最初のコマンドには、いくつかの二重引用符を含む 1 つの文字列があります。変数は展開されません。
2 番目のコマンドには、引用符\n
で囲まれていない 2 つの文字列があります。変数が展開されます。
$1
「何とか」が含まれているとしましょう
最初はこの文字列を perl に渡します:
print $1,"\n" if /([0-9\.]+):161/
2番目、これ:
print blah,\n if /([0-9\.]+):161/