Sed 或其他脚本以及用于剪切文件名的正则表达式解决方案

Sed 或其他脚本以及用于剪切文件名的正则表达式解决方案

我需要从文件名中获取 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 时几乎需要转义任何内容,因此才显得丑陋。

相关内容