【发布时间】:2015-04-15 05:56:23
【问题描述】:
我正在使用 bash 读取包含完整路径文件名的文本文件。有些将 fwd-slash 开头作为第一个字符,但大多数缩进三个空格,如下所示:
/my/top/level/file
/my/top/level/file/one_more.txt
/my/top/level/file/two_more.txt
读取文件没有问题,问题是我似乎无法想出正确的模式匹配来从这些缩进行中获取文件名。我正在使用这个:
if [[ $line =~ ^([[:space:]][[:space:]][[:space:]])(.*)$ ]] ; then
filename_indented=${BASH_REMATCH[2]}
else
filename=$line
fi
我认为 bash 模式匹配并不像真正的正则表达式那样复杂,但我希望将解决方案保持为全 bash,不使用 sed。
那么有什么诀窍呢?我感觉到微妙之处正在发生。
【问题讨论】:
-
不知道为什么你需要
[[:space:]]引用空间就足够了。 -
我认为您的解决方案应该有效。以上有什么问题?
-
你得到的输出是什么?如果您使用
while read,那么前导空格将被截断,else子句将正常工作。那就是你根本不需要使用任何正则表达式匹配。您编写的代码是正确的,并且如果您分配像line=" test"这样的变量并带有前导空格,则可以正常工作。