首页 > 解决方案 > Bash:如何在“\ n”上将字符串拆分为可迭代的字符串系列?

问题描述

如果我有一个字符串,如下所示: :x: **Line 1**\n`Line 2`

如何将其拆分为由“\n”分隔的 2 个字符串(在本例中),以便可以按如下方式遍历它:

for LINE in $STRING
do
   echo "Line: $LINE"
done


Line: :x: **Line 1**
Line: `Line 2`

我从这里尝试过的所有其他示例似乎都没有这样做,它们只会一次性打印出整个字符串。

例如,我试过这个:

STRING=":x: **Line 1**\n\`Line 2\`"
while IFS= read -r line; do
    echo "Line: $line"
done <<< "$STRING"

我得到:

Line: :x: **Line 1**\n`Line 2`

标签: bash

解决方案


将文字\n转换为换行符并在while循环中使用:

STRING=":x: **Line 1**\n\`Line 2\`"
while IFS= read -r line; do
    echo "Line: $line"
done < <(sed 's/\\n/\n/g' <<< "${STRING}")

或者使用这个printf想法(包括 CharlesDuffy 的评论):

while IFS= read -r line
do
    echo "Line: $line"
done < <(printf '%b\n' "${STRING}")

注意:添加额外\n内容以确保第二行正确终止,以便while循环可以读取它。

两者都应该生成:

Line: :x: **Line 1**
Line: `Line 2`

推荐阅读