如何使用';循环一行值';然后将其打印为列表。unixkornshell

如何使用';循环一行值';然后将其打印为列表。unixkornshell,shell,loops,for-loop,delimiter,cut,Shell,Loops,For Loop,Delimiter,Cut,我试图使用带“,”的分隔符循环一个文件,并在“列表”中打印这些值,但我不确定如何获取分隔符的所有值 我有一个这样的电子邮件文件(全部在一行): 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

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

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

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

有什么想法吗?

以下是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"
EmailsFile=“/dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt”
当IFS=时,读取-r-A电子邮件;做
printf'%s\n'${emails[@]}

与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"
EmailsFile=“/dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt”
当IFS=时,读取-r-A电子邮件;做
printf'%s\n'${emails[@]}

完成您也可以使用
sed

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

您还可以使用
sed

sed 's/,/\n/g' "$EmailsFile"
使用
tr

tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt
tr“,”\n“
当你想在每行添加一些单词时,试试看

printf "found address %s in input\n" $(tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt
printf“在输入中找到地址%s\n”$(tr),“\n”
使用
tr

tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt
tr“,”\n“
当你想在每行添加一些单词时,试试看

printf "found address %s in input\n" $(tr "," "\n" < /dev/fs/C/Users/myuser/Desktop/EMAILSTOREAD.txt
printf“在输入中找到地址%s\n”$(tr),“\n”
…除此之外--这是哪个ksh版本?ksh93?ksh88?由David Korn以外的人编写的一些随机克隆?不确定是什么ksh,我如何检查它?…要清楚的是,真正的David Korn ksh过去是花钱的商业软件(这就是为什么创建pdksh、mksh等的原因)但是,自从2005以来,它是免费的,在EPL下是许可的,所以没有理由使用克隆。考虑使用微软的Ubuntu运行时——有一个真正的KSH9-包……但是,除了那个——KSH版本是什么?KSH93KHS88?David Korn以外的人写的一些随机克隆?不确定KSH是什么,如何CA?n我检查一下?…说得清楚,真正的David Korn ksh过去是花钱的商业软件(这就是为什么要创建pdksh、mksh等)但是自从2005以来,它是免费使用的,在EPL下是许可的,所以没有理由使用克隆。考虑使用微软的Ubuntu运行时-有一个真正的KSH93-包。我们也希望使用<代码>剪切<代码>类似于接收所有文件在<代码>查找< /COD>和<代码> GRP。@ MikkaMiSOS,没有好的R。因此,可以使用
cut
。从
find
中读取时间和任意文件名列表的安全方法是使用
-printf
格式字符串,在名称后加上NUL,在时间和名称之间的时间戳中不存在字符,并在每个循环i中使用两个独立的
read
s为每个值填充一个变量。(文件名中可以有换行符,但NULs不能,因此
\n
格式字符串不如
\0
安全)@marikamitsos,…因此,为了在本机bash中安全地执行读取结束,类似于:
while IFS=read-r-d$'\t'timestamp&&IFS=read-r-d''filename;do…;done<谢谢Charles。您可以将此作为一个答案发布(最好不要在bash中发布,因为我在命令行上几乎没有弄湿脚)在我最初的帖子?@Inian中,ksh需要的是
-A
,而不是
-A
(后者是bash使用的)。应在93u+中使用该更改。我们还希望使用
cut
以类似的方式接收
find
grep
@marikamitos下的所有文件,…。没有充分的理由为此使用
cut
。从
find
读取时间列表和任意文件名的安全方法是使用
-printf
格式化字符串,在名称后加一个NUL,在时间和名称之间的时间戳中不能存在一个字符,并在每个循环迭代中使用两个独立的
read
s为每个值填充一个变量。(换行符可以存在于文件名中,但NULs不能,因此您的格式字符串不如
\0
安全。)@marikamitsos,…因此,为了在本机bash中安全地执行读取结束,类似于:
while IFS=read-r-d$'\t'timestamp&&IFS=read-r-d''filename;do…;done<谢谢Charles。您可以将此作为一个答案发布(最好不要在bash中发布,因为我在命令行上几乎没有弄湿脚)在我最初的帖子?@Inian下,ksh的代码应该是
-A
,而不是
-A
(后者是bash使用的)。如果有这种变化,它应该在93u+中工作。