**用**别名转义单引号

**用**别名转义单引号

我知道过去有很多关于转义单引号的问题,但没有一个解决这个挑战,即如何做到这一点有别名

我已经成功定义了许多别名来替换 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'
}

相关内容