Это можно сделать с помощью обхода, как показано на рисунке:
$ grep -Pc '^(?!\.)(?!.*\.\..*)(?=.*\..*\.)' file.txt
Читать как:
^
(?!\.)
(?!.*\.\..*)
(?=.*\..*\.)
Поскольку вы используете $odi_cluster
без кавычек в вызове echo
, оболочка разделит значение переменной на любой символ, который также встречается в $IFS
(, а затем выполнит подстановку имени файла для сгенерированных слов ). Обычно $IFS
содержит пробел, символ табуляции и новую строку, но вы установили -как запятую.
Если значение переменной равно odi_server1,odi_server2
и $IFS
содержит запятую, это разбиение приводит к двум словам odi_server1
и odi_server2
. Они будут переданы echo
в виде двух отдельных аргументов, а утилита echo
выведет их через пробел.
Чтобы IFS
не влиял на вывод, запретите оболочке разбивать значение переменной, заключая расширение в кавычки:
echo "$odi_cluster"
или
printf '%s\n' "$odi_cluster"
Связанные:
Обратите внимание, что вы можете установить переменную IFS
только для read
встроенной -утилиты, вызвав read
, например
IFS=, read...
Это позволяет избежать установки IFS
значения по умолчанию, отличного от -, для остальной части скрипта.
Возможно также связано:
Также обратите внимание, что символы #
и !
строки#!
-должны быть самыми первыми символами файла, и что вам не нужно заканчивать каждое выражение символом ;
, если нет дальнейшие утверждения в той же строке.