将字符串分成两个级别

问题描述 投票:3回答:4

我有以下字符串

my_str="A:Apple|B:Ball|C:Cat"

并且我想回声以下

A for Apple
B for Ball
C for Cat

我使用的代码是

IFS="|"
delimiter=':'
my_str="A:Apple|B:Ball|C:Cat"
for pair in ${my_str}; do
  #echo "${pair}"
  s=$pair$delimiter
  var1=${s%%"$delimiter"*}
  var2=${s#*"$delimiter"}
  echo "${var1} for ${var2}"
done

但是我得到的输出是

A for Apple:
B for Ball:
C for Cat:

有人可以帮我删除末尾附加的定界符吗?

bash
4个回答
4
投票

bash的read提供用于自定义行定界符的选项(-d),您可以将其与IFS结合使用。

while IFS=':' read -r -d '|' k v; do
    printf '%s for %s\n' "$k" "$v"
done <<< ${my_str%|}'|'

1
投票

[第一解决方案:请您尝试以下方法。

echo "$my_str" | awk -F'|' '{gsub(/:/," for ");for(i=1;i<=NF;i++){print $i}}'

[第二解决方案:使用gsub合理警告,仅使用显示的示例编写和测试。

echo "$my_str" | awk '{gsub(/:/," for ");gsub(/\|/,"\n")} 1'

输出如下。

A for Apple
B for Ball
C for Cat

0
投票

使用gnu-awk

awk -F ':|\n' -v RS='|' '{print $1, "for", $2}' <<< "$my_str"

A for Apple
B for Ball
C for Cat

对于POSIX awk,请使用此:

awk -F '[:|]' 'NF%2 == 0{for (i=1; i<=NF; i+=2) print $i, "for", $(i+1)}' <<< "$my_str"

0
投票

使用两次对read的调用:一个将线拆分为一个数组,另一个将其拆分为数组的每个元素。

my_str="A:Apple|B:Ball|C:Cat"

IFS="|" read -a pairs <<< "$my_str"
for pair in "${my_str[@]}"; do
    IFS=: read letter object <<< "$pair"
    printf '%s for %s\n' "$letter" "$object"
done
© www.soinside.com 2019 - 2024. All rights reserved.