简单的Unix方式循环通过空格分隔的字符串?

tzdcorbm  于 2022-11-04  发布在  Unix
关注(0)|答案(4)|浏览(172)

我有一个名为file_list的文件,其中包含空格分隔的字符串,每个字符串都是要处理的文件的文件名。现在,我希望遍历所有文件名,并逐个处理它们。伪代码为

for every filename in file_list
    process(filename);
end

我想出了一个相当笨拙的解决办法,就是
1.通过filenames='cat file_list'将文件加载到变量中
1.用tr -cd ' ' <temp_list | wc -c来计算空格数N
1.从1循环到N,并通过用cut隔开每个文件名来进行解析
有没有更简单/更优雅的方法?

cwdobuhd

cwdobuhd1#

最简单的方法是一个经典的技巧,已经在伯恩壳了一段时间。

for filename in `cat file_list`; do
  # Do stuff here
done
z2acfund

z2acfund2#

您可以将档案变更为以行分隔文字,而不是以空格分隔文字。这样,您就可以使用一般语法:

while read line
do
   do things with $line
done < file

tr ' ' '\n' < file中,您可以用新行替换空格,这样就可以:

while read line
do
   do things with $line
done < <(tr ' ' '\n' < file)

测试

$ cat a
hello this is a set of strings
$ while read line; do echo "line --> $line"; done < <(tr ' ' '\n' < a)
line --> hello
line --> this
line --> is
line --> a
line --> set
line --> of
line --> strings
de90aj5v

de90aj5v3#

下面是另一个在bash中有效的方法,没有人发布:

str="a b c d"

for token in ${str}; do
    echo "$token"
done

在其他shell中运行此脚本的里程可能会有所不同。

lf5gs5x2

lf5gs5x24#

xargs在这里也可以用于一个很好的1-liner。默认情况下,它可以通过任何空格进行拆分。

xargs -n 1 process <file_list

或将文件名放在命令中:


# mac

xargs -n 1 -J % process(%) <file_list

# unix

xargs -n 1 -d " " -i process({}) <file_list

相关问题