닫히지 않은 따옴표가 포함된 리터럴 문자열을 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"

문자 그대로 문자열을 입력하고 를 누르면 Returnprintf명령에 전달할 수 있는 적절하게 인용된 문자열이 표시됩니다.

예:

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

관련 정보