awkのワンライナーでシングルクォーテーションを使いたいときのエスケープ等の回避方法4個

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
Sponsored Links

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

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*