我有以下字符串
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的read
提供用于自定义行定界符的选项(-d
),您可以将其与IFS
结合使用。
while IFS=':' read -r -d '|' k v; do
printf '%s for %s\n' "$k" "$v"
done <<< ${my_str%|}'|'
[第一解决方案:请您尝试以下方法。
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
使用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"
使用两次对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