3

私は次のことをしようとしていますが、疲れすぎて考えられないか、エスケープで何か奇妙なことが起こっています:

scanimage -L | gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
pipe bquote> 
4

5 に答える 5

7

これを行うイディオムは、一重引用符を含む変数を作成し、それを使用することです。

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####
于 2012-02-05T09:50:39.847 に答える
2

バックスラッシュ ( ) を含む一重引用符には特殊文字はありません\

文字を一重引用符 ( ) で囲むと'、引用符内の各文字のリテラル値が保持されます。バックスラッシュが前にある場合でも、単一引用符の間に単一引用符が出現しない場合があります。

コマンドを次のように変更できます。

$ scanimage -L | awk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
于 2012-02-05T09:52:54.430 に答える
1

シェル '...' はバックスラッシュのエスケープをサポートしていません。残念ながら、代わりに「...」を使用する必要があります。

gawk "/N650U/ {print gensub(\"['`]\", \"\", \"g\", \$2)}\"

(シェル "..."$ 変数を展開するので、それもエスケープする必要があることに注意してください!)

于 2012-02-05T09:53:35.973 に答える
0
gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
     ^                         ^
     beginning of sq string       end of single quoted string

少し醜いですが、これは機能します:

gawk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
于 2012-02-05T09:54:55.713 に答える
0

これを行う正しい方法は次のとおりです。

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 ページで文字列と正規表現の区切り記号を調べてください。

于 2014-09-22T13:07:29.003 に答える