我知道过去有很多关于转义单引号的问题,但没有一个解决这个挑战,即如何做到这一点有别名。
我已经成功定义了许多别名来替换 sed/awk/grep/perl 命令,这些命令在最新版本的 bash (4.4.0(1)) 中使用正则表达式。
例如,以下别名可以转义双引号在任何字符串中:
alias esc_double_quotes=$'sed \'s|"|\\\\"|g\''
string="JC's alias to escape \"double quotes\""
echo "$string" | esc_double_quotes
JC's alias to escape \"double quotes\"
然而,当谈到用别名转义单引号,看来任务是不可能的。
我已经尝试过了5种不同的方法由于不同的原因,它们都失败了:
# 1) My first technique
alias esc_single_quotes=$'sed \"s|'|\\\\'|g\"'
# 2) My second technique
alias esc_single_quotes="sed 's|'\''|\\\'\''|g'"
# 3) My third technique
alias esc_single_quotes="sed \"s|'|\\\\'|g\""
# 4) Technique inspired from http://stackoverflow.com/questions/1250079/how-to-escape-single-quotes-within-single-quoted-strings?answertab=active#tab-top
alias esc_single_quotes='sed '"'"'s|'|\\\\'|g'"'"
# 5) Technique inspired from http://stackoverflow.com/posts/1315213/revisions
alias esc_single_quotes='sed '\''s|'|\\\\'|g'\'''
有人会接受这个不可能的挑战并证明我错了吗?
答案1
我可以立刻逃离一切
printf "%q\n" "$string"
但这是你的答案:
alias esc_single_quotes="sed \"s/'/\\\\\\\\'/g\""
echo "$string" | esc_single_quotes
JC\'s alias to escape "double quotes"
或者 :
alias esc_single_quotes='sed "s/'\''/\\\\'\''/g"'
echo "$string" | esc_single_quotes
JC\'s alias to escape "double quotes"
答案2
为了帮助我们的眼睛,让我们简化一下:
$ alias esc_single_quotes='sed "s|\x27|\x5c\x5c\x27|g"'
$ echo "this is 'something'"
this is 'something'
$ echo "this is 'something'" |esc_single_quotes
this is \'something\'
答案3
#!/usr/bin/env bash
function esc_double_quotes() {
echo $* | sed 's|"|\\\\"|g'
}