閉じていない引用符を含むリテラル文字列をripgrepと一致させるにはどうすればよいですか?

閉じていない引用符を含むリテラル文字列をripgrepと一致させるにはどうすればよいですか?

いくつかのPythonコードを含むファイルがあります。次の内容(引用符を含む)を含む行があります。

'hello "value"'

'hello "value"ファイルから検索したいです。公開提案に注意してください。 ripgrepと次のコマンドを使用します。

rg -F 'hello "value"

上記のコマンドは'hello "value"bash / zshの入力には機能しません。私が望むのは文字通り一致するだけです。そのフラグを使用しましたが、F入力文字列に閉じる引用符がないため、まったく機能しません。また、次のように一重引用符/二重引用符で入力を囲みようとしました。

rg -F "'hello "value""またはrg -F ''hello "value"'

上記の方法も機能しません。

Fこのフラグがripgrepに入力を文字通り考慮するように指示すると仮定しますか?どうすれば解決できますか?

ベストアンサー1

テキスト'hello "value" シェルで見る一重引用符で始まり、終了しません。残りの文字列の入力を求めるプロンプト($PS2通常)が表示されます。>

このようなものを検索するには、シェルで引用符(両方のタイプ)をエスケープする必要があります。次のことができます。

"'hello \"value\""

または、すべてのリテラル二重引用符をエスケープしたくない場合は、最初の一重引用符を引用し、残りの文字列を一重引用符で残します。

"'"'hello "value"'
^1 ^3            ^4      
  ^2
  • 1-2 前半に一重引用符を含む二重引用符文字列
  • 3-4リテラル二重引用符を含む一重引用符文字列

特に複雑な文字列がある場合、スクリプトから文字列を読み取るのに問題はありません。コマンドラインから文字列を読み取るのではなく、シェルに解析を試みないように指示できます。〜するそれを分析してみてください

#!/bin/bash
[[ $# -eq 0 ]] && IFS= read -rp "Enter search string: " item
rg -F "${1:-$item}"

スクリプトを実行可能にします$PATH。コマンドラインに何かを提供すると、そのスクリプトが使用されます。それ以外の場合は、文字列を入力するように求められ、複雑な文字列を入力できます。


脚注として、混乱しているのは、Windows / DOSの世界では、プログラムがコマンドライン自体を解析することを期待しているということです。シェルがコマンドラインを解析し、結果の引数をコマンドに渡すUNIX / Linuxの世界ではそうではありません。コマンドラインを解析しないようにシェルに指示する方法はありません。これがコマンドラインを解析することです。したがって、コマンドラインを使用するか、シェルをバイパスする必要があります。関連読書には以下が含まれます。シェルで引用符をエスケープする方法は?そしてシェルの「...」、「...」、$'...'、および$"..."引用符の違いは何ですか? 、引用などについて詳しく説明します。

おすすめ記事