zsh: event not found: PQXY|OFEJ).)
Поскольку это zsh
повышение ошибки, это почти , конечно, , потому что он пытается обработать вещи в двойных кавычках. Чтобы защитить его от этого, вы должны использовать одинарные кавычки, такие как:
pcregrep -c '(?s)(^PQXY(?:(?!PQXY|OFEJ).)*OFEJ\n)' file.txt
У меня не установлено pcregrep
, но вот расшифровка, показывающая проблему только с echo
:
pax> echo "(?s)(^PQXY(?:(?!PQXY|OFEJ).)*OFEJ)"
zsh: event not found: PQXY|OFEJ).)
pax> echo '(?s)(^PQXY(?:(?OFEJ)'
(?s)(^PQXY(?:(?OFEJ)
С точки зрения решения проблемы вместо использования специального инструмента c , Я бы на самом деле выбрал awk
(а) в этом случае. Вы можете сделать что-то вроде:
awk '/^PQXY/ { s = $0; c = 1; next}
/OFEJ$/ { if (c == 1) { print s""ORS""$0; c = 0 }; next }
/OFEJ|PQXY/ { c = 0; next }
c == 1 { s = s""ORS""$0 }' inputFile
Это работает с использованием строки и флага для контроля собранных строк и определения состояния, изначально они являются пустой строкой и нулем.
Затем для каждой строки :
- Если он начинается с PQXY, сохраните строку и установите флаг сбора, затем go на следующую строку ввода.
- В противном случае, если он заканчивается на
OFEJ
и вы собираете, выводите собранный участок и прекращаете сбор, затем go к следующей строке ввода. - В противном случае, если в нем есть какая-либо из строк, прекратите сбор, перейдите к следующей строке ввода.
- В противном случае, если собирать, добавить текущую строку и перейти (неявно) к следующей строке ввода.
Я проверил это с некоторыми ограниченными тестовыми данными, и, похоже, все работает нормально. Вот сценарий bash
(b) , который я использовал для тестирования. Вы можете добавить столько тестов, сколько вам нужно, чтобы это решило вашу проблему.
for i in \
"PQXY 1\nabc\n2 OFEJ\n" \
"PQXY 1\nabc\n2 OFEJx\n" \
"PQXY 1\nabc\n PQXY \n2 OFEJ\n" \
"PQXY 1\nabc\n OFEJ \n2 OFEJ\n" \
"PQXY 1\nabc\ndef\nPQXY 2\n2 OFEJ\n" \
; do
echo "$i:"
printf "$i" | awk '
/^PQXY/ { s = $0; c = 1; next}
/OFEJ$/ { if (c == 1) { print s""ORS""$0; c = 0 }; next }
/OFEJ|PQXY/ { c = 0; next }
c == 1 { s = s""ORS""$0 }' | sed 's/^/ /
'
done
Вот вывод так что вы можете увидеть это в действии:
PQXY 1\nabc\n2 OFEJ\n:
PQXY 1
abc
2 OFEJ
PQXY 1\nabc\n2 OFEJx\n:
PQXY 1\nabc\n PQXY \n2 OFEJ\n:
PQXY 1\nabc\n OFEJ \n2 OFEJ\n:
PQXY 1\nabc\ndef\nPQXY 2\n2 OFEJ\n:
PQXY 2
2 OFEJ
(a) По моему опыту, если вы попробовали три вещи с регулярным выражением в стиле grep
без успеха обычно быстрее перейти к более сложному инструменту: -)
(b) Да, я знаю, что оно написано в bash
, а не zsh
, но это потому, что :
- это программа test , чтобы показать вам, что
awk
работает, следовательно, используемый язык не имеет значения; и - Мне гораздо удобнее с
bash
tahn zsh
: -)