У меня есть файл cases
:
foo
bar
cases:
1: foo
2: bar
baz
cases:
3: baz
quux
Поскольку отступ всегда возвращается снова после случаев, я хочу перечислить случаи с grep -zoP '(\s*)cases:\n(\1.*\n)*' cases
, но это выводит
cases:
cases:
Если я использую grep -zoP '(\s*)cases:\n(\1.*\n){1,}' cases
, я получаю желаемый результат:
cases:
1: foo
2: bar
cases:
3: baz
Такое поведение не проявляется ни в одном похожем регулярном выражении, которое я пробовал:
$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoo'
foobarfoofoofoofoo
$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -oP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)\n*bar'<<<$'foo\n\n\n\n\n'
foo
$
Почему grep предпочитает соответствовать моему регулярному выражению 0 раз?
@ BenjaminW. Спасибо, что указали на это, исправили.
Я думаю, что проблема в \1
, поскольку обратная ссылка заставляет соответствовать точно таким же символам, что не удается, если есть другое количество пробелов, то есть grep -zoP '(\s*)cases:\n(\s.*\n)*' cases
Я думал, что это ошибка, но мне было указано, что \s
, который является синонимом класса символов POSIX [:space:]
, соответствует [ \t\n\r\f\v]
в локали C и, следовательно, также соответствует предыдущему символу новой строки здесь.
Этот последний пример верен? Еще я получил
bar
в конце. Кроме того, кажется, что твое последнее предложение оборвано.