【问题标题】:How to loop a line of values using ',' and the print it as a list. Unix Korn Shell如何使用“,”循环一行值并将其打印为列表。 Unix Korn Shell
【发布时间】:2016-10-20 16:05:22
【问题描述】:

我正在尝试使用带有 ',' 的分隔符循环文件,并在“列表”中打印出这些值,但我不确定如何获取分隔符的所有值。

我有一个包含这样电子邮件的文件(全部在一行中):

test1@mail.com,test2@mail.com,test3@mail.com

我的脚本是这样的:

EmailsFile="/dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt"

for email in $(cat ${EmailsFile} | cut -d "," -f 1-100)
do
   echo "${email}\n"
done

我做了 1-100,因为我不确定该文件可以包含多少个值。

我得到的输出是:

test1@mail.com,test2@mail.com,test3@mail.com

预期输出:

test1@mail.com
test2@mail.com
test3@mail.com

有什么想法吗?

【问题讨论】:

  • ...除此之外——这是哪个 ksh 版本? ksh93? ksh88?由大卫科恩以外的人写的一些随机克隆?
  • 不确定 ksh 是什么,如何检查?
  • ...明确地说,真正的 David Korn ksh 曾经是需要花钱的商业软件(这就是创建 pdksh、mksh 等的原因),但自 2005 年以来,它已根据EPL,所以没有理由使用克隆。
  • 考虑使用微软的 Ubuntu 运行时——有一个真正的 ksh93 包。

标签: shell loops for-loop delimiter cut


【解决方案1】:

以下内容适用于 David Korn ksh93:

EmailsFile="/dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt"
while IFS=, read -r -A emails; do
    printf '%s\n' "${emails[@]}"
done <"$EmailsFile"

一般情况下,请避免使用$()catcut 等。除非绝对必要;它们比 shell 内置功能慢得多(尤其是在 ksh 中,它是一个非常高性能的 shell)。

【讨论】:

  • 我们还想在类似的issue 中使用cut 来接收findgrep 下的所有文件。
  • @marikamitsos,...没有充分的理由为此目的使用 cut。从find 读取时间列表和任意文件名的安全方法是使用-printf 格式字符串,在名称后放置一个NUL,以及时间和名称之间的时间戳中不存在的字符,并在每次循环迭代中使用两个单独的reads 来为每个值填充一个变量。 (文件名中可以​​存在换行符,但 NUL 不能,所以\n 是您的格式字符串不如\0 安全)。
  • @marikamitsos, ...所以,要在本机 bash 中安全地完成读取,例如:while IFS= read -r -d $'\t' timestamp &amp;&amp; IFS= read -r -d '' filename; do ...; done &lt; &lt;(find ... -printf '%T@\t%p\0')
  • 谢谢查尔斯。您能否将其作为答案发布(最好不要在 bash 中,因为我几乎没有在命令行上弄湿脚)?
  • @Inian,对于 ksh,它必须是 -A,而不是 -a(后者是 bash 使用的)。应该可以在 93u+ 中使用该更改。
【解决方案2】:

你也可以使用sed

sed 's/,/\n/g' "$EmailsFile"

【讨论】:

    【解决方案3】:

    使用tr:

    tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt
    

    当你想在每一行添加一些单词时,试试

    printf "found address %s in input\n" $(tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt
    

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 2016-06-05
      • 1970-01-01
      • 2016-08-23
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多