バックスラッシュを印刷するには、awkを使用してください。

バックスラッシュを印刷するには、awkを使用してください。

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

また見なさい:


更新された質問を検討してください。

\"一部のデータの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倍にする必要があります。$stringawk

また、プログラムに文字列を渡すときに二重引用符を使用して値を設定する場合は、stringすべての二重引用符を2倍にする必要があります。awk -vawk再び(シェルは二重引用符バックスラッシュで動作するためです)そして文字列から二重引用符をエスケープします。

string="\\\\\\\\\""
awk -v string="$string" '$0 ~ string' file

したがって、ここの最初の行はシェルで次のようにstring設定され、バックスラッシュと二重引用符を一致させるために必要な内容に基づいて正規表現として評価されます。\\\\"awk -v string="$string"awk -v string='\\"'

おすすめ記事