Как вывести значения, разделенные запятыми, используя IFS="," в оболочке

Это можно сделать с помощью обхода, как показано на рисунке:

$ grep -Pc '^(?!\.)(?!.*\.\..*)(?=.*\..*\.)' file.txt

Читать как:

  • Я стою в начале очереди и смотрю направо^
  • Я вижу, что строка не начинается с буквальной точки(?!\.)
  • Глядя дальше вперед, я нигде не вижу двух последовательных буквальных точек(?!.*\.\..*)
  • Но я вижу две точки, но поскольку последовательные точки были исключены в моем предыдущем просмотре вперед, это означает, что эти две точки ДОЛЖНЫ быть разделены по крайней мере одним не -точечным символом(?=.*\..*\.)
  • К.Э.Д.
0
08.10.2020, 12:41
1 ответ

Поскольку вы используете $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значения по умолчанию, отличного от -, для остальной части скрипта.

Возможно также связано:

Также обратите внимание, что символы #и !строки#!-должны быть самыми первыми символами файла, и что вам не нужно заканчивать каждое выражение символом ;, если нет дальнейшие утверждения в той же строке.

2
18.03.2021, 22:59

Теги

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