Ваш -w
разрушает ваш день.На странице руководства, описывающей опцию -w:
Выберите только те строки, которые содержат совпадения, образующие целые слова.Тест состоит в том, что соответствующая подстрока должна быть либо в начале строки, либо предшествовать не состоящему из слов символу.
Если у вас есть строка v2.example: , символ перед точкой - 2 , который является символом слова и, следовательно, не соответствует.Конечно, вы можете написать
grep -F ".$ns" ....
, но это также поймает .exampleabc .
Пока ваша переменная ns
не содержит символов, которые имеют специальное значение в регулярном выражении, вы можете использовать
grep -E "[.]$ns\\>" ....
, поскольку \>
соответствует границе слова.Однако, если ns
содержит такой символ, это не будет работать.Вы можете улучшить его на
grep -E "[.]\\Q$ns\\E\\>" ....
, потому что то, что находится между \Q
и \E
, воспринимается буквально, но это решение также не идеально: если ns
сам содержит эти специальные escape-символы, вы получите смешнойрезультаты.
Технически, нужно было бы экранировать все символы регулярных выражений внутри ns
, но делать это только с помощью инструментов оболочки POSIX - это то, что я даже не заставил бы моего врага сделать это.Если вам действительно нужно решение, которое работает в общем случае, возможно, проще выполнить поиск с помощью небольшого скрипта, написанного на таких языках, как Perl или Ruby, где у вас есть встроенные функции для экранирования регулярных выражений.