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