Как сопоставить литеральную строку, содержащую незакрытую кавычку, с помощью ripgrep?

простое решение с использованием awk

awk ' { print $0, toupper($0) ; } ' /tmp/tmp1.txt

или

( echo a ; echo b ; echo c ;  ) | awk ' { print $0, toupper($0) ; } '

или с помощью именованного конвейера или fifo

( echo a ; echo b ; echo c ) |
(
  D=$(mktemp -d) ;
  (
    cd $D ;
    mkfifo fifo_a fifo_b ;
    paste fifo_b <( tr '[:lower:]' '[:upper:]' < fifo_a ) &
    tee  fifo_a  > fifo_b  ;
    wait ;
    rm fifo_a fifo_b
  ) ;
  rmdir $D
)
5
20.05.2021, 19:08
3 ответа

Текст '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, где оболочка анализирует командную строку и передает результирующие аргументы команде. Невозможно указать оболочке не анализировать командную строку -, это то, что она делает -, поэтому вам нужно работать с этим или обойти оболочку. Связанное чтение: Как избежать кавычек в оболочке? и В чем разница между кавычками «…», «…», $'…' и $«…» в оболочке? , в которых более подробно объясняется цитирование цитат и т. д.

12
28.07.2021, 11:30

Если строка требует цитаты из ада, вы можете воспользоваться помощью heredoc, чтобы бросить вам спасательный круг:

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

Кроме того, вы можете поместить все эти неприятные регулярные выражения в файл, подальше от посторонних глаз оболочки, и использовать их в ripgrep с помощью опции файла -f.

4
28.07.2021, 11:30

Чтобы немного расширить roaima's ответьте -, если вы используете Bash вы можете использовать модификатор printf %q, который заставляет printf выводить соответствующий аргумент в формате, который можно повторно использовать в качестве оболочки ввод . Полезным -вкладышем будет:

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

Введите строку буквально, нажмите Вернуть , и printfотобразит правильно цитируемая строка, которую вы можете передать командам оболочки.

Пример:

$ read -r &&  printf "%q\n" "$REPLY"
'hello "value"'
\'hello\ \"value\"\'
$ echo \'hello\ \"value\"\'
'hello "value"'
3
28.07.2021, 11:30

Теги

Похожие вопросы