例如:
hisrmline 'h | g -E "^ [0-9]* exit$"'
如果我想要手动转义,可以这样做:
'hisrmline '\''h | g -E "^ [0-9]* exit$"'\'''
但这很费时间,效率也不高。所以我找到了printf %q:
[xiaobai@xiaobai note]$ printf "%q" hisrmline 'h | g -E "^ [0-9]* exit$"'
hisrmlineh\ \|\ g\ -E\ \"\^\ \[0-9\]\*\ \ exit\$\"[xiaobai@xiaobai note]$
[xiaobai@xiaobai note]$
输出结果错误是因为hisrmlineh被拼接在一起了,所以我缩小了字符串范围:
[xiaobai@xiaobai note]$ printf "%q" hisrmline 'h'
hisrmlineh[xiaobai@xiaobai note]$
[xiaobai@xiaobai note]$
我需要的是 hisrmline\ \'h\'。
在使用 grep 命令时,这个功能特别有用:
[xiaobai@xiaobai note]$ HISTTIMEFORMAT=""; history|grep -a --color=auto hisrmline\ \'h
7856 hisrmline 'hisrmline'
7857 hisrmline 'hisrmline'
7882 hisrmline 'h | g -E "^ [0-9]* exit[ ]*$"'
7883 hisrmline 'h | g -E "^ [0-9]* exit[ ]*$"'
7884 hisrmline 'h | g -E "'
7885 hisrmline 'h | g '
7886 hisrmline 'h | g'
7887 hisrmline 'h |'
7890 hisrmline 'h | g -E "^ [0-9]* exit$"'
7891 hisrmline 'h | g -E "^ [0-9]* exit$"'
7905 h|g 'hisrmline 'h | g -E "^ [0-9]* exit$"''
使用 grep -F 在处理嵌套的单引号时并不能让我的生活更轻松,我仍然需要手动转义单引号 '\'':
[xiaobai@xiaobai note]$ HISTTIMEFORMAT=""; history|grep -a --color=auto -F '[0-9]* exit$"'\'''
7889 h|g -aF 'h | g -E "^ [0-9]* exit$"'
7890 hisrmline 'h | g -E "^ [0-9]* exit$"'
7891 hisrmline 'h | g -E "^ [0-9]* exit$"'
7905 h|g 'hisrmline 'h | g -E "^ [0-9]* exit$"''
7911 h|g 'hisrmline 'h | g -E "^ [0-9]* exit$"''
7912 h|g 'hisrmline '"'"'h | g -E "^ [0-9]* exit$"'"'"'
有没有更简单的方法或者现有的工具可以转义包含任意字符的字符串列表?
"
,请看我的更新答案。你可以将整个字符串读入变量str
中,然后简单地使用:printf "%q\n" "$str"
。 - anubhava