В присваиваниях переменных не должно быть пробела вокруг =
.
BTW, с zsh
:
dcnarray=("${(@Oa)FILES_dcn}")
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"
.
С grep:
grep -v "^0$" file
^
означает начало строки, $
означает конец строки.
grep -v "\b0\b"
grep -v "^0$"
-w работает, но в вашем случае 0,2 — это два слова, потому что символ точки является разделителем слов.
grep
's -w
немного запутан в том смысле, что он разбивает исходную строку на слова и не -составляющие слова (что-либо, кроме букв, цифр или подчеркивания ). Поскольку он уже встречал допустимую составляющую слова 0
в 0.02
, он утверждал логику отрицания, чтобы удалить строку.
Использование sed
в этом контексте немного проще, так как нужно просто удалить целые слова, соответствующие
sed '/^0$/d' file
Когда строки, которые вы хотите удалить , содержат только и 0
, за которыми следует следующая строка , вы можете выбрать эти строки, введя следующую команду:
grep -v "^0$"
Будут напечатаны только те вхождения 0
, которые находятся в конце строки и в начале строки одновременно. Затем опция -v
инвертирует наш выбор.
Еще один ответ для разнообразия, если у вас включен PCRE -grep
grep -Pv "^0(?!\.)"
это выполняет отрицательный просмотр вперед для сопоставления строк, которые начинаются с 0
и не после точки. Затем -v
отбрасывает не соответствующие -строки. Вы можете увидеть в действии здесь
Хотяgrep
можно использовать для этого (, как ясно показывают другие ответы ), давайте сделаем шаг назад и подумаем о том, чего вы на самом деле хотите:
Regex интерпретирует данные последовательности символов. Они ничего не знают о числах, только об отдельных цифрах (и их правильных комбинациях ). Хотя в вашем конкретном случае есть простой способ обойти это ограничение, в конечном итоге это несоответствие требованиям.
Если нет веской причины использовать grep
здесь (, например. поскольку вы измерили его, и он намного эффективнее, а эффективность имеет решающее значение в вашем случае ), я рекомендую использовать другой инструмент.
awk
, например, может фильтровать на основе числовых сравнений, т.е.:
awk '$1 == 0' your_file
А также, чтобы получить все строки, содержащие числа больше нуля:
awk '$1 > 0' your_file
Я люблю регулярное выражение, это отличный инструмент. Но это не единственный инструмент. Как говорится, если у вас есть только grep
, все выглядит как обычный язык.
Предположим, что любая строка, состоящая не только из одного 0, имеет период
grep '\.' file