awkをワンライナーで使っていると、処理の中でシングルクォーテーションを使いたいときが多々ある。
ただ、処理をシングルクォーテーションで囲っている場合、うまくエスケープするには工夫が必要だったりでちょっと面倒くさい。ので、エスケープ以外にもうまいことシングルクォーテーションを利用する方法が無いかと思って調べてみた。
1.エスケープする
エスケープをしてシングルクォーテーションを利用する場合は、以下の例のようにダブルクォーテーションで「’\”」としてエスケープしたシングルクォーテーションを囲ってやると利用できる。
awk '{print "'\''"}'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1"'\''"$2}' abc'123 def'456
2.ダブルクォーテーションで囲む
「$」をエスケープする必要が出て来るが、awkの処理をシングルクォーテーションではなくダブルクォーテーションで囲むことで、シングルクォーテーションをそのまま使用できるようにする。
ただ、その際もダブルクォーテーションで囲む必要があるのでだいぶ野暮ったくなる。
awk "{print\"'\"}"
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk "{print \$1\"'\"\$2}" abc'123 def'456
3.変数に代入する
awk実行時に変数にシングルクォーテーションを代入しておくことで、処理内でエスケープせずに利用する。
以下の例では、変数「q」にシングルクォーテーションを代入している。
awk -v q=\' '{print q}' awk '{print q}' q=\'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk -v q=\' '{print $1q$2}' abc'123 def'456 blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1q$2}' q=\' abc'123 def'456
4.アスキーコードで指定する
シングルクォーテーションをアスキーコードで指定することで対応することも可能。
awk '{print "\x27"}' awk '{print "\047"}'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1"\x27"$2}' abc'123 def'456 blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1"\047"$2}' abc'123 def'456
