正则表达式替换日期部分

时间:2018-09-28 03:05:30

标签: regex sed

我有一个类似的文件 A_B_C_D_E_F_20180904_0038849_SUPER03.txt

我只想提取A_B_C_D_E_F.txt

我的尝试

echo A_B_C_D_E_F_20180904_0038849_SUPER03.txt |sed -e 's/'_[0-9]{8}_.*'/'*.txt'/g'

4 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

echo A_B_C_D_E_F_20180904_0038849_SUPER03.txt \
  |sed -e 's/_[0-9]\{8\}_[0-9]\{7\}_[A-Z0-9]*//g'

其中:
_[0-9]\{8\}-匹配_20180904
_[0-9]\{7\}-匹配_0038849
_[a-zA-Z0-9]*-匹配_SUPER03

结果是:A_B_C_D_E_F.txt

答案 1 :(得分:1)

这可能对您有用(GNU sed):

sed 's/_[0-9][^.]*//' file

删除第一次出现的下划线,然后删除一个整数直到一个句点。

答案 2 :(得分:1)

如果将文件名分配给变量,并且外壳程序为bash,则可以避免使用sed并直接使用参数扩展:

v="A_B_C_D_E_F_20180904_0038849_SUPER03.txt"
echo "${v%_*_*_*}.${v#*.}"
A_B_C_D_E_F.txt

bash运算符%#分别删除匹配的后缀或前缀模式。

答案 3 :(得分:0)

一些事情需要改变:

  • 您不应使用-e选项运行sed,该选项旨在运行sed脚本
  • 您不需要sed中的单引号
  • 您应该使用\{\}来表示sed的正则表达式语法中的量词
  • 替换文字中不需要通配符*

通过上述更改,这将产生A_B_C_D_E_F.txt

echo A_B_C_D_E_F_20180904_0038849_SUPER03.txt |sed 's/_[0-9]\{8\}_.*/.txt/'