Использование регулярного выражения с переменной IFS для разделения строки Bash

Вы можете использовать Wicd , он имеет командную строку и графический интерфейс для управления сетью Wi-Fi. Я использовал его некоторое время как облегченную альтернативу NM. Это избавит вас от необходимости работать с wpa_supplicantвручную.

2
29.06.2020, 08:34
3 ответа

IFS нельзя использовать таким образом. Он не принимает регулярное выражение. Как минимум, символы (литерал ), составляющие IFS, используются оболочкой для разделения слов при расширении слов. Например.

IFS=: read -r v1 v2 <<<"foo:bar"

То, что вы определили в IFS="[^a-zA-Z]", воспринимает символы буквально, т.е. каждый из [, ^, a, -, z, A, Zи ]является используются в качестве разделителей для разделения вашей входной строки, что явно не то, что вы ожидаете.

0
18.03.2021, 23:24

Вместо того, чтобы возиться с IFS, вам лучше отобразить входную строку, а затем разбить ее, используя IFS по умолчанию:

read -ra name_parts <<<"$(printf '%s\n' "$input" | LC_ALL=C tr -cs 'a-zA-Z\n'  '[ *]')"

Теперь часть имени массива _будет содержать строку, разрезанную по небуквенным позициям.

0
18.03.2021, 23:24

IFS — это просто набор символов (или байтов ), а не регулярное выражение. Но вы можете использовать, например. awk или sed, чтобы разделить строку на основе регулярного выражения, распечатать ее с более простым разделителем, а затем прочитать с помощью readоболочки.

read -ra name_parts < <(awk -vFS='[^a-zA-Z]' -vOFS=' ' '{$1=$1; print}' <<< "$input")

или

read -ra name_parts < <(sed -e 's/[^a-zA-Z]/ /g' <<< "$input")
1
18.03.2021, 23:24

Теги

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