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