Как разделить одну строку на несколько переменных в оболочке bash? [дубликат]



этот вопрос уже есть ответ здесь:



Я искал решение и нашел похожие вопросы, только они пытались разделить предложения с пробелами между ними, и ответы не работает для меня ситуация.



в настоящее время переменная устанавливается на что-то вроде строки:
ABCDE-123456

и я хотел бы разделить это на 2 переменные, устраняя " -". т. е.:
var1=ABCDE
var2=123456




Как это возможно, чтобы достичь этого?





это решение, которое сработало для меня:
var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)



можно ли использовать вырезать команда, которая будет работать без разделителя (каждый символ устанавливается как переменная)?



var1=$(echo $STR | cut -f1 -d?)
var2=$(echo $STR | cut -f1 -d?)
var3=$(echo $STR | cut -f1 -d?)
etc.

1025   6  

6 ответов:

Если ваше решение не должно быть общим, т. е. должно работать только для строк, подобных вашему примеру, вы можете сделать:

var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

Я выбрал cut здесь, потому что вы можете просто расширить код для еще нескольких переменных...

read С IFS идеально подходит для этого:

$ IFS=- read var1 var2 <<< ABCDE-123456
$ echo "$var1"
ABCDE
$ echo "$var2"
123456

Edit:

вот как вы можете прочитать каждый отдельный символ в элементы массива:

$ read -a foo <<<"$(echo "ABCDE-123456" | sed 's/./& /g')"

дамп массива:

$ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]="-" [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'

если в строке есть пробелы:

$ IFS=$'\v' read -a foo <<<"$(echo "ABCDE 123456" | sed 's/./&\v/g')"
$ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]=" " [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'

если вы знаете, что это будет только два поля, вы можете пропустить дополнительные подпроцессы следующим образом:

var1=${STR%-*}
var2=${STR#*-}

что это значит? ${STR%-*} удаляет самые короткие строки $STR это соответствует шаблону -* начиная с конца строки. ${STR#*-} делает то же самое, но с *- шаблон и начиная с начала строки. У каждого из них есть двойники %% и ## где найти длинной якорный шаблон матч. Если кто-нибудь имеет полезную мнемонику, чтобы помнить, что делает, дайте мне знать! Я всегда стараюсь помнить и то и другое.

звучит как работа для set с пользовательским IFS.

IFS=-
set $STR
var1=
var2=

(вы хотите сделать это в функции с local IFS Так что вы не испортите другие части вашего скрипта, где вы требуете IFS чтобы быть тем, что вы ожидаете.)

используя возможности регулярных выражений bash:

re="^([^-]+)-(.*)$"
[[ "ABCDE-123456" =~ $re ]] && var1="${BASH_REMATCH[1]}" && var2="${BASH_REMATCH[2]}"
echo $var1
echo $var2

выход

ABCDE
123456
string="ABCDE-123456"
IFS=- # use "local IFS=-" inside the function
set $string
echo  # >>> ABCDE
echo  # >>> 123456

Comments

    Ничего не найдено.