吹く

吹く

以下のように文字列を含む変数があります。

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

列のリストが大きくなる可能性があります。

次の出力が必要です

@col1,@col2,@col3,@col4

答え1

唯一の目標が変数のすべての値(つまり文字通り@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

答え2

$ 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

答え3

あなたはそれを使用することができますawk

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

フィールド区切り記号は、フラグを含むFS構造の左側に設定されます。key=value=

値の後にはすでにカンマがあるので、出力フィールドの区切り文字は空です。

レコード全体に適用する合計{$1=$1}をトリガーします。awkFSOFS

最後に、1awkの基本ジョブであるレコード印刷が実行されます。

答え4

吹く

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

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

真珠

echo "$VAR" |
perl -F'/=|,/' -lpe '
   $_ = join ",", grep { $a++ % 2 } @F;
'

関連情報