根据.txt和空格分割字符串

时间:2018-11-05 04:40:03

标签: bash

我有一个文件名列表,在一个名为file的变量中带有空格 我想遍历文件并获取文件名

files='a 1 .txt b 1 .txt c1.txt d 2 3 .txt'
IFS=$'\n'
for file in $files; do echo $file ; done;

我的预期输出是

a 1 .txt 
b 1 .txt 
c1.txt 
d 2 3 .txt

我不确定如何将字符串分割开来吗?

2 个答案:

答案 0 :(得分:1)

NB :这是一个真的坏主意。不要这样修复设置变量的代码。

您可以使用awk来分割字符串,如下所示:

awk -F'.txt ?' '{for (i=1; i<NF; i++) printf "%s.txt\n", $i}' <<<$files |
while read filename; do
  echo "doing something with \"$filename\""
done

这将在输出中产生:

doing something with "a 1 .txt"
doing something with "b 1 .txt"
doing something with "c1.txt"
doing something with "d 2 3 .txt"

但这是一个更好的主意:

如果要在变量中放入文件列表(可能包含空格),请不要这样做:

files=$(ls *.txt)

如您所见,您最终遇到的基本上是垃圾。使用findxargs处理文件,如:

find . -name '*.txt' -print0 | xargs -0 ...

或循环遍历ls的输出:

while read filename; do
    ...do something with $filename here...
done < <(ls *.txt)

根据您要完成的工作,可能还有其他解决方案。

答案 1 :(得分:1)

您也可以使用Perl一线式实现。

> export files='a 1 .txt b 1 .txt c1.txt d 2 3 .txt'
> perl -ne 'BEGIN{@arr=split(".txt",$ENV{files});foreach(@arr){~s/(^\s*)|(\s+$)//g;print "$_.txt\n"} exit } '
a 1.txt
b 1.txt
c1.txt
d 2 3.txt
>