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\!
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\!\
