私は次のことをしようとしていますが、疲れすぎて考えられないか、エスケープで何か奇妙なことが起こっています:
scanimage -L | gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
pipe bquote>
これを行うイディオムは、一重引用符を含む変数を作成し、それを使用することです。
scanimage -L | gawk '/N650U/ {print gensub(q"`", "", "g", $2)}' q="'"
ただし、文字クラスで使用しているため、これは機能しないため、次のようにする必要があります。
scanimage -L | gawk '/N650U/ {print gensub("[`'\'']", "", "g", $2)}'
<-- 1st pair --> <-- 2nd pair -->
使用する場合の別の代替手段は、単一引用符のエスケープをサポートするbash
使用です$''
scanimage -L | gawk $'/N650U/ {print gensub("[`\']", "", "g", $2)}'
2番目のケースで行っているのは、文字通りの単一引用符の直前に単一引用符のペアを作成し、単一引用符をエスケープしてシェルが解釈しないようにし、その後に別の単一引用符のペアを作成することだけです。
$ echo $'foo`\'' | awk '{gsub(/[o`'\'']/,"#")}1'
f####
$ echo "foo" | awk '{print q$0q}' q="'"
'foo'
$''
echo $'foo`\'' | awk $'{gsub(/[o`\']/,"#")}1'
f####
バックスラッシュ ( ) を含む一重引用符には特殊文字はありません。\
文字を一重引用符 ( ) で囲むと
'
、引用符内の各文字のリテラル値が保持されます。バックスラッシュが前にある場合でも、単一引用符の間に単一引用符が出現しない場合があります。
コマンドを次のように変更できます。
$ scanimage -L | awk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
シェル '...' はバックスラッシュのエスケープをサポートしていません。残念ながら、代わりに「...」を使用する必要があります。
gawk "/N650U/ {print gensub(\"['`]\", \"\", \"g\", \$2)}\"
(シェル "..."は$ 変数を展開するので、それもエスケープする必要があることに注意してください!)
gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
^ ^
beginning of sq string end of single quoted string
少し醜いですが、これは機能します:
gawk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
これを行う正しい方法は次のとおりです。
scanimage -L | gawk '/N650U/ {print gensub(/[\047`]/, "", "g", $2)}'
一重引用符の使用には影響しません\047
が、投稿された他のすべてのソリューションが文字列区切り文字を使用していることを考えると、gsub() の最初の引数である正規表現の周りに文字列区切り文字の代わりに正規表現区切り文字を使用することに注意してください。重要です。たとえば、次を参照してください。
$ printf 'a\\tb\n' | awk '{sub(/\\t/,"X")}1'
aXb
$ printf 'a\\tb\n' | awk '{sub("\\t","X")}1'
a\tb
$ printf 'a\\tb\n' | awk '{sub("\\\\t","X")}1'
aXb
正規表現コンテキストで文字列区切り記号を使用する唯一の場合は、リテラルと変数を連結する必要がある場合です。たとえば、次のようになります。
awk '{sub("<"var">","")}1'
詳細については、man ページで文字列と正規表現の区切り記号を調べてください。