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