простое решение с использованием 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
)
Текст 'hello "value"
, видимый оболочке , начинается с одинарной кавычки и никогда не заканчивается. Вы получите приглашение продолжения ($PS2
, часто >
), запрашивающее остальную часть строки.
Чтобы найти что-то подобное, вам нужно экранировать кавычки (обоих видов )из оболочки, что вы можете сделать следующим образом
"'hello \"value\""
Или, если вы не хотите экранировать все буквальные двойные кавычки, заключите начальную одинарную кавычку и оставьте остальную часть строки в одинарных -кавычках
"'"'hello "value"'
^1 ^3 ^4
^2
Если у вас есть особенно сложные строки, не будет ничего плохого в том, что вы читаете строку из скрипта, где оболочке можно дать указание не пытаться анализировать ее, а не в командной строке, где она будет попытка разобрать
#!/bin/bash
[[ $# -eq 0 ]] && IFS= read -rp "Enter search string: " item
rg -F "${1:-$item}"
Сделайте скрипт исполняемым и поместите его куда-нибудь в свой $PATH
. Если вы укажете что-то в командной строке, он будет использовать это. Если вы этого не сделаете, он запросит строку, и вы можете ввести ее с любой сложностью.
В качестве примечания:возможно, часть путаницы заключается в том, что мир Windows/DOS ожидает, что программа сама анализирует командную строку. Это не так в мире UNIX/Linux, где оболочка анализирует командную строку и передает результирующие аргументы команде. Невозможно указать оболочке не анализировать командную строку -, это то, что она делает -, поэтому вам нужно работать с этим или обойти оболочку. Связанное чтение: Как избежать кавычек в оболочке? и В чем разница между кавычками «…», «…», $'…' и $«…» в оболочке? , в которых более подробно объясняется цитирование цитат и т. д.
Если строка требует цитаты из ада, вы можете воспользоваться помощью heredoc
, чтобы бросить вам спасательный круг:
rg -Ff - <<\! your_file_python
'hello "value"
!
Кроме того, вы можете поместить все эти неприятные регулярные выражения в файл, подальше от посторонних глаз оболочки, и использовать их в ripgrep с помощью опции файла -f.
Чтобы немного расширить 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"'