bashでパイプで受け取った値を自動エスケープして出力する

bashで、パイプで渡した値をエスケープした状態で出力させる必要があったので、備忘で残しておく。
sedやawk、printfなどでできる。

sedを使う場合

sed -e 's/[][^$.*?+!\\()&|'\''"]/\\&/g'
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | sed -e 's/[][^$.*?+!\\()&|'\''"]/\\&/g'
\'aaaa\&aa#a
b\\bb\"
sx\$sss\!

 

awkを使う場合

awk '{gsub(/[][^$.*?+!\\()&|'\''"]/, "\\\\&", $0);print $0}'
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | awk '{gsub(/[][^$.*?+!\\()&|'\''"]/, "\\\\&", $0);print $0}'
\'aaaa\&aa#a
b\\bb\"
sx\$sss\!
Sponsored Links

printfを使う場合

printfでは、%qで自動エスケープをしてくれる。
標準入力をwhileで受け取ってやり、出力をする。

(while read -r r ;do printf '%q\n' "$r" ;done)
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | (while read -r r ;do printf '%q\n' "$r" ;done)
\'aaaa\&aa#a
b\\bb\"
sx\$sss\!

 

pythonの場合

python -c 'import sys,re; print(re.escape(sys.stdin.read()).rstrip())'
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | python -c 'import sys,re; print(re.escape(sys.stdin.read()).rstrip())'
\'aaaa\&aa\#a\
b\\bb\"\
sx\$sss\!\

 


Written by blacknon

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

Leave a Comment

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

*