bash将字符串拆分为数组并写入文件

时间:2014-08-05 14:44:32

标签: bash shell unix sh

我想用分隔符逗号分割字符串并将其写入文件。我有下面的脚本但是当我看到输出(temp.txt)时,我看到写入文件的完整for循环代码.. 任何人都可以帮我解决这个问题

#!/bin/bash -e

string1=a/b,b/c,c/d

IFS=', ' read -a array <<< "$string1"

cat << 'EOF' > temp.txt
for element in "${array[@]}"
do
    echo "$element"
done
EOF

预期文件temp.txt输出

a/b
b/c
c/d

3 个答案:

答案 0 :(得分:2)

使用printf

#!/bin/bash -e
string1=a/b,b/c,c/d
IFS=', ' read -ra array <<< "$string1"
printf '%s\n' "${array[@]}" > temp.txt

更长的路:

for e in "${array[@]}"; do
    echo "$e"
done > temp.txt

另一个使用IFS:

IFS=$'\n' eval 'echo "${array[*]}" > temp.txt'

注意:更改IFS是不必要的,但如果您想用逗号严格拆分字符串,请将其更改为IFS=,

IFS=, read -ra array <<< "$string1"

答案 1 :(得分:1)

您的IFS不正确,应该没有空格。此外,您可以将循环的输出间接到文件:

#!/bin/bash -e

string1=a/b,b/c,c/d

IFS=',' read -a array <<< "$string1"
for element in "${array[@]}"
do
    echo "$element"
done > temp.txt

如果您的唯一目的是将逗号转换为换行符,则可以使用像tr这样简单的内容:

tr , '\n' <<<"$string1" > temp.txt

答案 2 :(得分:1)

你也可以在这样的循环中使用read builtin命令的-d选项:

while read -d, -r; do
    echo "$REPLY"
done <<<"$string1," > temp.txt

您会注意到我在,扩展的末尾添加了string1,因为-d正在用,替换换行符。

虽然它需要更多的代码,但是你可以避免在循环之后通过另一个echo $REPLY向此字符串添加额外的逗号。

{ while read -d, -r; do
      echo "$REPLY"
  done <<<"$string1"
  echo $REPLY
} > temp.txt

你也可以使用子行到echo你的数组使用换行符IFS

IFS=, read -ra array <<<"$string1"
(IFS=$'\n'; echo -e "${array[*]}") > temp.txt