pcregrep, исключая несколько строк, регулярное выражение съедает на одну строку больше, чем необходимо

Если вы хотите использовать /etc/network/interfaces, то просто удалите или отключите network-manager

1
01.08.2017, 02:02
2 ответа

Такие задачи лучше подходят для awkimo

$ awk '!/^ /{f=0} /^banana/{f=1} f' fruits.txt 
banana starts matching
 this line should match
 this too
 and this
$ awk '!/^ /{f=0} /^banana/{f=1} !f' fruits.txt 
apple
mango
pomelo
  • Порядок установки флага помогает легко печатать или отрицать конкретные искомые строки, поскольку !/^ /условие выполняется для строки, начинающейся с banana, а также
  • !/^ /{f=0}если строка не начинается с пробела, снять флаг
  • /^banana/{f=1}установить флаг, если строка начинается сbanana
  • fпечатает строки, соответствующие условию, а !fотрицает условие
0
27.01.2020, 23:45

Использование вами \sв регулярном выражении означает, что выражение может потреблять новые строки. Я недостаточно знаком с тем, как -vреализован в pcregrep, чтобы понять, почему это не инверсия, но я почти уверен, что причина именно в этом.

Если вы измените свой файл на:

apple
banana starts matching
 this line should match
 this too
 and this

mango

pomelo

Тогда даже без -vсовпадение выглядит не так, как вы задумали.

$ pcregrep  -M 'banana.*\n(\s.*\n)*' fruits.txt
banana starts matching
 this line should match
 this too
 and this

mango

pomelo

Если действительно должен совпадать только пробел в начале строки, я предлагаю заменить \sна один или несколько пробелов " +".

Когда я изменяю регулярное выражение на 'banana.*\n( +.*\n)*', оно соответствует (как обычному, так и обратному )способом, который я считаю более правильным. Возможно, используйте [ \t]+, если также разрешены вкладки.

1
27.01.2020, 23:45

Теги

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