閉じていない引用符を含むリテラル文字列を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の世界ではそうではありません。コマンドラインを解析しないようにシェルに指示する方法はありません。これがコマンドラインを解析することです。したがって、コマンドラインを使用するか、シェルをバイパスする必要があります。関連読書には以下が含まれます。シェルで引用符をエスケープする方法は?そしてシェルの「...」、「...」、$'...'、および$"..."引用符の違いは何ですか? 、引用などについて詳しく説明します。

答え2

文字列を地獄で参照する必要がある場合は、heredocライフラインを提供する方法を使用できます。

rg -Ff - <<\! your_file_python
'hello "value"
!

あるいは、シェルの覗き見から離れて、すべての不愉快な正規表現をファイルにスローし、ripgrepに-f fileオプションでそれを使用させることもできます。

答え3

拡張してくださいエマ・ルーオの答え%q- Bashを使用している場合は、printf修飾子を使用できます。printfがシェル入力として再利用できる形式でその引数を出力するようにします。。便利な行は次のとおりです。

read -r &&  printf "%q\n" "$REPLY"

文字通り文字列を入力してを押すと、Returnシェルprintfコマンドに渡すことができる適切に引用符付きの文字列が表示されます。

例:

$ read -r &&  printf "%q\n" "$REPLY"
'hello "value"'
\'hello\ \"value\"\'
$ echo \'hello\ \"value\"\'
'hello "value"'

関連情報