Bash 如何拆分以';分隔的字段列表';到'||';?

Bash 如何拆分以';分隔的字段列表';到'||';?,bash,Bash,我有一个场景,我将以以下格式获得输出: 1,2,3,4,5,6||7,8,9,10,11,12||13,14,15,16,17,18||19,20,21,22,23,24 我能够将整个结果存储到bash变量中 例如,我创建了一个bash变量myvar和另外6个变量a、b、c、d、e、fmyvar包含上述结果集 我需要的是,当我在第一个循环中循环myvar时,它应该分配如下: a=1,b=2,c=3,d=4,e=5,f=6 并准备一个html正文并将其发送给其他人 在第二个循环中 g=7,h=

我有一个场景,我将以以下格式获得输出:

1,2,3,4,5,6||7,8,9,10,11,12||13,14,15,16,17,18||19,20,21,22,23,24
我能够将整个结果存储到bash变量中

例如,我创建了一个bash变量
myvar
和另外6个变量
a、b、c、d、e、f
myvar
包含上述结果集

我需要的是,当我在第一个循环中循环myvar时,它应该分配如下:

a=1,b=2,c=3,d=4,e=5,f=6
并准备一个html正文并将其发送给其他人 在第二个循环中

g=7,h=8,i=9,j=10,k=11,l=12
再次准备一个html正文并将其发送给其他人

我在循环区被打动了

然后做一些html邮件正文,当它只返回时我就可以这样做

1,2,3,4,5,6


请告诉我所提供的信息是否与你们的回答足够相关。

这只是一个可以扩展的示例

在下面,您可以使用$1、$2、$3、$4等进行进一步处理(如分配给变量a、b、c…)或直接使用$variables等

x="1,2,3,4,5,6||7,8,9,10,11,12||13,14,15,16,17,18||19,20,21,22,23,24"
echo $x | cut -d'|' -f1- --output-delimiter=$'\n' | sed -e '/^[ ]*$/d' > /tmp/data.txt
for line in `cat /tmp/data.txt`; do awk -F',' '{print $1, $2, $3, $4, $5}' <<< $line; done
x=“1,2,3,4,5,6 | | 7,8,9,10,11,12 | | | 13,14,15,16,17,18 | | 19,20,21,22,23,24”
echo$x | cut-d'|''''-f1----输出分隔符=$'\n'| sed-e'/^[]*$/d'>/tmp/data.txt

对于“cat/tmp/data.txt”中的行;执行awk-F',“{print$1,$2,$3,$4,$5}”您可以通过设置
IFS='|'
来拆分输入行,但不幸的是,您使用了
|
作为分隔符。显示了使用and
IFS=''
执行第二个数组参数扩展的技巧。在您的情况下,这相当于:

#!/bin/bash

# '(' execute the following commands in a subshell, see `man bash` (search for
# "Compound Commands").
(

# disable filename expansion
set -f

input="1,2,3,4,5,6||7,8,9,10,11,12||13,14,15,16,17,18||19,20,21,22,23,24"

# split by '|'
IFS='|'
lines=(${input})

# remove empty elements
IFS=""
lines=(${lines[@]})

for ((i=0; i < ${#lines[@]}; i++)); do
  echo "Processing ${i}: '${lines[${i}]}'"

  IFS=','
  elements=(${lines[${i}]})

  for ((j=0; j < ${#elements[@]}; j++)); do
    echo "  found element ${elements[${j}]}"
  done

  # here you can either use ${elements[${0}]}, ..., ${elements[${5}]} directly
  # or you can assign them to your variables:
  # set a="${elements[${0}]
  # set b="${elements[${1}]
  # ...

done

)
参考资料


感谢您的及时回复。它的结果和预期的一样。但是,请你扩展一下你的回答,我如何为循环中传递到这个语句中的每个值分配不同的变量。谢谢你的“Micha Wiedenmann”,它的结果完全符合预期。请你也扩展一下你的答案,看看如何将它分配给每个循环中的不同变量。我认为我问题的最后一部分是不正确的。在每个循环中,变量a、b、c、d、e、f的值应动态变化。例如,在第一个循环中为1,2,3,4,5,6,在第二个循环中为7,8,9,10,11,12。请直截了当地回答我的问题,因为我刚刚开始编写bash脚本两天。提前感谢。@JagapathiRaju我更新了代码,以显示如何设置变量,但我建议您改用元素数组。感谢我能够以这种方式使用,并且我能够使用这些变量值作为每个循环的一部分来向下游发送电子邮件。a=${elements[0]}b=${elements[1]}。感谢您的帮助。@JagapathiRaju请记住投票并接受答案。
% ./foo.sh
Processing 0: '1,2,3,4,5,6'
  found element 1
  found element 2
  found element 3
  found element 4
  found element 5
  found element 6
Processing 1: '7,8,9,10,11,12'
  found element 7
  found element 8
  found element 9
  found element 10
  found element 11
  found element 12
Processing 2: '13,14,15,16,17,18'
  found element 13
  found element 14
  found element 15
  found element 16
  found element 17
  found element 18
Processing 3: '19,20,21,22,23,24'
  found element 19
  found element 20
  found element 21
  found element 22
  found element 23
  found element 24