**エイリアスを使用して一重引用符をエスケープします。 [重複]

**エイリアスを使用して一重引用符をエスケープします。 [重複]

過去に一重引用符をエスケープする方法について多くの質問があったことはわかっていますが、それらのどれもこれを行う方法に関する問題に対処していません。エイリアスあり

最新バージョンのbash(4.4.0(1))では、正規表現を使用するsed / awk / grep / perlコマンドを置き換えるために複数のエイリアスを正常に定義しました。

たとえば、エイリアスは二重引用符をエスケープできます。任意の文字列から:

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'
}

関連情報