awkを使用すると、次のバックスラッシュを含むシーケンスを印刷(または検索)するのに問題があります。
echo "test\test" | awk '{ gsub(/\\\\t/, "\\\\&"); print }'
結果は次のとおりです。
test est
\t はタブ文字として解釈されるためです。文字列をそのままにしたいです。つまり、次のようになります。
test\test
echoコマンドは、bashスクリプトを使用してファイル内の\ tのようなパターンを見つけることができることを確認するために、awkコマンドの行1をチェックする別の方法です。具体的には - awk cmdが必要な場合はシリーズを探す必要があります。
\"
私は以下を使用しています:
awk -v st="$match_string" 'BEGIN {gsub(/\\\\"/,"\\\\&", st)} match($0,st {print;exit}' file.txt
しかし、cmdは機能しません。次の内容を含むファイルの場合:
547 %$
236 \"
4523 &*
8876 (*
8756 "/
...
次のように出力されます。
> \"
8756 "/
awkを使って見つける正しい方法は何ですか
236 \"
ありがとう
答え1
タブにecho
展開されるということです。バックスラッシュを含む文字列を出力する\t
ために使用しないでくださいecho
。代わりに使用してくださいprintf
。
printf '%s\n' 'test\test' | awk '{ print }'
また見なさい:
-
そこから家に帰るというメッセージがあります。
POSIXは次のように言います。最初の引数に
-n
バックスラッシュが含まれる場合、動作は指定されません。
更新された質問を検討してください。
\"
一部のデータの2番目の列を一致させ、\"
文字列をプログラムに引数として渡そうとしますawk
。
string='\\"'
awk -v string="$string" '$2 == string' file
が返されます
236 \"
質問にデータを提供します。を呼び出すときにシェルで変数を一度拡張する必要があるため、バックスラッシュをエスケープする必要がありますawk
。
また、使用することができます
string='\"' awk '$2 == ENVIRON["string"]' file
つまり、文字列をawk
環境変数としてプログラムに渡します。この場合、バックスラッシュは次のようになります。いいえ脱出する必要があります。
行全体に正規表現を使用するには、次のようにします。
string='\\\\"'
awk -v string="$string" '$0 ~ string' file
または、
string='\\"' awk '$0 ~ ENVIRON["string"]' file
正規表現のバックスラッシュの一致はを介して行われるため、\\
これをに渡す必要がありますawk
。使用すると、呼び出し時にコマンドラインの値が拡張されるため、awk -v
各バックスラッシュを2倍にする必要があります。$string
awk
また、プログラムに文字列を渡すときに二重引用符を使用して値を設定する場合は、string
すべての二重引用符を2倍にする必要があります。awk -v
awk
再び(シェルは二重引用符バックスラッシュで動作するためです)そして文字列から二重引用符をエスケープします。
string="\\\\\\\\\""
awk -v string="$string" '$0 ~ string' file
したがって、ここの最初の行はシェルで次のようにstring
設定され、バックスラッシュと二重引用符を一致させるために必要な内容に基づいて正規表現として評価されます。\\\\"
awk -v string="$string"
awk -v string='\\"'
答え2
echo "test\\test"
必要に応じてできますが、awkを好む場合は、次のように印刷できます。
$ echo "test\test" | awk ' { print }'
test\test