Получение значений из строки

У меня есть переменная со строкой, как показано ниже

name=@col1, zip_cd=@col2, district=@col3, city=@col4

список столбцов может увеличиваться.

Мне нужен вывод ниже

@col1,@col2,@col3,@col4
0
18.11.2018, 08:44
5 ответов

Bash

VAR='name=@col1, zip_cd=@col2, district=@col3, city=@col4'
echo "$VAR" |
while IFS= read -r line
do
   IFS='=,'; set -f; set -- $line
   while case $# in 0 ) break ;; esac
   do
      shift
      printf '%s' "${1}${2+,}"
      shift
      ${1+':'} echo
   done
done

Sed

echo "$VAR" |
sed -ne '
   H;g
   :loop
      s/\(\n\)[^=]*=\([^,]*,\{0,1\}\)/\2\1/
   tloop
   P
'

Perl

echo "$VAR" |
perl -F'/=|,/' -lpe '
   $_ = join ",", grep { $a++ % 2 } @F;
'
0
28.01.2020, 02:46
var='name=@col1, zip_cd=@col2, district=@col3, city=@col4'

newvar=$( printf '%s' "$variable" | awk 'BEGIN { RS=" "; ORS=""; FS="=" } { print $2 }' )

printf '%s\n' "$newvar"
@col1,@col2,@col3,@col4

Сценарий awk обрабатывает ввод как серию записей, разделенных пробелами, но устанавливает разделитель записей ( RS ) в виде символа пробела (по умолчанию - новая строка). Это дает нам следующие записи:

name=@col1,
zip_cd=@col2,
district=@col3,
city=@col4

Он также разделяет каждую из этих записей на поля по символу = (путем установки FS , разделителя полей), что дает нам записи условно разделен на столбцы следующим образом:

name     @col1,
zip_cd   @col2,
district @col3,
city     @col4

Затем печатается второе поле каждой записи. При этом он использует пустой разделитель записей (разделитель выходных записей по умолчанию, ORS , является новой строкой), что дает нам желаемый результат.

Я поместил вывод awk в новую переменную и распечатал его в стандартном выводе.

0
28.01.2020, 02:46

Вы можете использовать awk :

echo "name=@col1, zip_cd=@col2, district=@col3, city=@col4" | awk 'BEGIN{FS="[^=,]*=";OFS=""} {$1=$1}1'

Разделитель полей FS установлен слева от Конструкция ключ = значение , включая знак = .

Разделитель выходных полей пуст, так как после значения уже стоит запятая.

{$ 1 = $ 1} запускает awk для применения FS и OFS ко всей записи.

Наконец, 1 запускает действие по умолчанию в awk: распечатать запись.

0
28.01.2020, 02:46
$ myvar='name=@col1, zip_cd=@col2, district=@col3, city=@col4'


$ echo $myvar
name=@col1, zip_cd=@col2, district=@col3, city=@col4

$ echo $myvar | awk -F, '{for(i=1;i<=NF;i++){split($i,a,"=");printf("%s,",a[2])}}'
@col1,@col2,@col3,@col4
0
28.01.2020, 02:46

Если ваша единственная цель - напечатать все значения переменных (т.е. буквально @ col1, @ col2, @ col3, @ col4 ), используйте массив:

$ array=($name $zip_cd $district $city)

Вывод:

$ oIFS="$IFS" # save IFS for later
$ IFS=","
$ echo ${array[*]}
@col1,@col2,@col3,@col4
$ IFS="$oIFS"`enter code here`

Если вы хотите загрузить столбцы в переменные, выведите их:

$ line="foo bar qaz qux"
$ oIFS="$IFS" # save IFS for later
$ IFS=" " # space, if $line has spaces/tabs, convert them into single spaces below
$ line=`sed 's/\s\+/ / <<< $line`
$ array=($line)
$ IFS="," # for display
$ echo ${array[*]}
foo,bar,qaz,qux
1
28.01.2020, 02:46

Теги

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