![닫히지 않은 따옴표가 포함된 리터럴 문자열을 ripgrep과 일치시키는 방법은 무엇입니까?](https://linux55.com/image/191422/%EB%8B%AB%ED%9E%88%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EB%94%B0%EC%98%B4%ED%91%9C%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%A6%AC%ED%84%B0%EB%9F%B4%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20ripgrep%EA%B3%BC%20%EC%9D%BC%EC%B9%98%EC%8B%9C%ED%82%A4%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
일부 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"'