可以简化吗?使用bash查找文件时提取文件名的一部分
find *.xml | sed -n "s/\(^.*\)\.xml/\1/p"
目标是检索xml文件的第一部分。 我刚刚注意到那里有一个正则表达式重复,并认为必须有一个简化版本
可以简化吗?使用bash查找文件时提取文件名的一部分
find *.xml | sed -n "s/\(^.*\)\.xml/\1/p"
目标是检索xml文件的第一部分。 我刚刚注意到那里有一个正则表达式重复,并认为必须有一个简化版本
不,没有简化版本。 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仅从尾部位置进行修剪。
请在awk中尝试以下内容,并告诉我这是否有帮助。
awk 'prev && FNR==1{close(prev);print prev} FNR==1{prev=FILENAME;sub(/\..*/,"",prev);} END{print prev}' *.xml
'ls * .xml |切-d。 -f1'(或'ls * .xml | rev | cut -d。-f2- | rev'如果名称包含句点。) – Anubis
@Anubis,请参阅[为什么不应该分析'ls'的输出]( http://mywiki.wooledge.org/ParsingLs) –
btw,'find * .xml'是(非常**非常**)越野车本身;不像'find。 -name'* .xml',它没有正确递归。 –