引用符のエスケープ

問題

 $ perl -e "print 'hello world'"
 hello world
  • 上のperlコマンドの引数になっている"print 'hello world'"のうち、ダブルクォートをシングルクォートにしたい
 $ perl -e 'print 'hello world''
  • 単純にダブルクォート(")シングルクォート(')に変えても動作しない

解法

 (1) 'print 'hello world''
 (2) 'print '\'hello world''
 (3) 'print '\''hello world''
 (4) 'print '\''hello world'\'
  • (1) この print 'hello world' の部分を1つの文字列になるようにエスケープする。pの前の'によってシングルクォートが開いており、hの前の'で閉じている
  • (2) クォートが閉じてる状態なので、hの前のシングルクォートは\'のようにエスケープしたシングルクォートを置く
  • (3) 次に、'でシングルクォートを開く
  • (4) dの後のシングルクォートで(3)のシングルクォートは閉じてる状態なので、\'でエスケープしたシングルクォートを置く

参考

 (1) bash -c "echo -n 'hello, ' && sleep 3 && echo -n 'World'"
 (2) bash -c 'echo -n 'hello, ' && sleep 3 && echo -n 'World''
 (3) bash -c 'echo -n '\''hello, '\'' && sleep 3 && echo -n '\''World'\'
  • (1)のようなコマンドのダブルクォートを(2)のようにシングルクォートに変える場合は(3)のようになる

$'...'を使った解法

 perl -e $'print \'hello world\''
  • シングルクォート('...')でくくる代わりに$'...'でくくる
  • くくった中のシングルクォート('hとd')は\'でエスケープする

参考

https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2021-12-04 (土) 12:50:09