使用bash查找文件时提取部分文件名

时间:2017-08-01 14:57:56

标签: regex linux bash sed find

这可以简化吗?

find *.xml |  sed -n "s/\(^.*\)\.xml/\1/p"

目标是检索xml文件的第一部分。 我刚刚注意到那里有一个正则表达式重复,并且认为必须有一个简化的版本

2 个答案:

答案 0 :(得分:1)

不,没有简化版本。 find是一种专业工具 - 它不会实现任意文本处理支持。

专注于正确性的版本实际上甚至会更多详细,看起来像:

while IFS= read -r -d '' filename; do
  base=${filename%.xml}
  echo "Filename $filename without its extension is $base" # put your actual command here
done < <(find . -name '*.xml' -print0)

...使用NUL分隔的流而不是换行符分隔的流(由于文件名可以包含换行符而容易出错),并使用parameter expansion仅从尾随位置进行修剪。 / p>

答案 1 :(得分:0)

尝试在awk中关注并告诉我这是否有帮助。

awk 'prev && FNR==1{close(prev);print prev} FNR==1{prev=FILENAME;sub(/\..*/,"",prev);} END{print prev}' *.xml