Grep удалить строку с 0, но не с 0,2?

В присваиваниях переменных не должно быть пробела вокруг =.


BTW, с zsh:

dcnarray=("${(@Oa)FILES_dcn}")
11
10.03.2019, 00:36
8 ответов
grep -vx 0

Изman grep:

-x, --line-regexp
       Select only those matches that exactly match the whole line.
       For a regular expression pattern, this is like parenthesizing
       the pattern and then surrounding it with ^ and $.

-wтерпит неудачу, потому что первое 0в 0.02считается "словом", и, следовательно, эта строка соответствует. Это связано с тем, что за ним следует символ «не -слово». Это можно увидеть, если запустить исходную команду без -v, т.е. grep -w "0".

35
27.01.2020, 19:56

С grep:

grep -v "^0$" file

^означает начало строки, $означает конец строки.

29
27.01.2020, 19:56
  • \b -граница слова

grep -v "\b0\b"

  • соответствует началу строки, вашему шаблону и концу строки

grep -v "^0$"

  • или, как предложил @Sparhawk -vx lineregexp

-w работает, но в вашем случае 0,2 — это два слова, потому что символ точки является разделителем слов.

1
27.01.2020, 19:56

grep's -wнемного запутан в том смысле, что он разбивает исходную строку на слова и не -составляющие слова (что-либо, кроме букв, цифр или подчеркивания ). Поскольку он уже встречал допустимую составляющую слова 0в 0.02, он утверждал логику отрицания, чтобы удалить строку.

Использование sedв этом контексте немного проще, так как нужно просто удалить целые слова, соответствующие

sed '/^0$/d' file
6
27.01.2020, 19:56

Когда строки, которые вы хотите удалить , содержат только и 0, за которыми следует следующая строка , вы можете выбрать эти строки, введя следующую команду:

grep -v "^0$"

Будут напечатаны только те вхождения 0, которые находятся в конце строки и в начале строки одновременно. Затем опция -vинвертирует наш выбор.

4
27.01.2020, 19:56

Еще один ответ для разнообразия, если у вас включен PCRE -grep

grep -Pv "^0(?!\.)"

это выполняет отрицательный просмотр вперед для сопоставления строк, которые начинаются с 0и не после точки. Затем -vотбрасывает не соответствующие -строки. Вы можете увидеть в действии здесь

1
27.01.2020, 19:56

Хотяgrepможно использовать для этого (, как ясно показывают другие ответы ), давайте сделаем шаг назад и подумаем о том, чего вы на самом деле хотите:

  • У вас есть файл, содержащий числа
  • Вы хотите выполнить фильтрацию на основе числового значения .

Regex интерпретирует данные последовательности символов. Они ничего не знают о числах, только об отдельных цифрах (и их правильных комбинациях ). Хотя в вашем конкретном случае есть простой способ обойти это ограничение, в конечном итоге это несоответствие требованиям.

Если нет веской причины использовать grepздесь (, например. поскольку вы измерили его, и он намного эффективнее, а эффективность имеет решающее значение в вашем случае ), я рекомендую использовать другой инструмент.

awk, например, может фильтровать на основе числовых сравнений, т.е.:

awk '$1 == 0' your_file

А также, чтобы получить все строки, содержащие числа больше нуля:

awk '$1 > 0' your_file

Я люблю регулярное выражение, это отличный инструмент. Но это не единственный инструмент. Как говорится, если у вас есть только grep, все выглядит как обычный язык.

14
27.01.2020, 19:56

Предположим, что любая строка, состоящая не только из одного 0, имеет период

grep '\.' file

0
27.01.2020, 19:56

Теги

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