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

时间:2014-09-16 13:52:46

标签: bash unix sh

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

for every filename in file_list
    process(filename);
end

我想出了一个相当笨拙的解决方案,这是

  1. filenames='cat file_list'
  2. 将文件加载到变量中
  3. N
  4. 计算空格数tr -cd ' ' <temp_list | wc -c
  5. 从1循环到N并按空格解析每个文件名cut
  6. 这样做是否更容易/更优雅?

4 个答案:

答案 0 :(得分:16)

最简单的方法是在bourne shell中使用一段时间的经典技巧。

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

答案 1 :(得分:7)

您可以更改文件,使单词以行分隔而不是空格分隔。这样,您可以使用典型语法:

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

答案 2 :(得分:3)

这是另一种没有人发布过的方法:

str="a b c d"

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

答案 3 :(得分:0)

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