我需要从文件名中获取 2-3 个变量。我使用:
FILES=$(ls -tr .../Files/)
for f in $FILES;
do
......
这些文件如下所示:
[字母和/或数字和(下划线或无)][6 位数字][下划线和最多 6 个字符或数字,或无任何内容][.][扩展名]
我需要第一部分 [] 六个数字和下划线+字符(如果存在)。因此 1. [] 2. [] 和 3.[]。
我尝试过的:
echo sanyi_123456_m2.txt | sed -e "s/^\(\w{4,40}\)\_?\(\\d{6}\)\_?\(\\w{,6}\)?\(\.\w{2,4}$\)/\\1 \\2 \\3/g"
我需要的是:
sanyi_ 123456 _m2
有人能帮我找到正则表达式解决方案吗?
多谢
答案1
首先,反斜杠太多了。此外,由于太过贪婪,第一个 glob 会吞噬整个字符串,直到点为止。您可能希望使用扩展正则表达式来清除图片。第二个下划线依赖于最后一部分(根据您的描述),必须用括号括起来。您不需要第四个 glob(在您的版本中)。
像这样:
echo sanyi_123456_m2.txt | sed -r "s/^([a-z]{4,40})_?([0-9]{6})(_(\w{,6}))?\.\w{2,4}$/\1 \2 \4/g"
您还可以使用可以进行非贪婪量化的 perl 正则表达式。
答案2
完美的解决方案是这样的:
$ echo sanyi123456_654321_987654.txt | sed -r "s/^([^_]{4,}_?)([0-9]{6})(_(\w{,6}))?\.\w{2,4}$/\1 \2 \4/g"
这是社区提供的修改版本,非常感谢。到目前为止,它适用于以下格式(目前所有格式):
karfiol_123123.txt
karfiol_123123_mpf123.txt
karfiol123123.txt
karfiol123123_123123.txt
karfiol123123_123123_123123.txt
karfiol123123_123123_mpf123.txt
karfiol123123_mpf123.txt
再次感谢
答案3
这个正则表达式可以完成这个工作:
echo "hehehehaha_123456_bc34.meh"|sed 's/\([^_]\+_\?\)\([0-9]\{,6\}\)\(_\w\{,6\}\)\?\..*/\1 \2 \3/'
不幸的是,使用 sed 时几乎需要转义任何内容,因此才显得丑陋。