Regex 正则表达式替换日期部分

Regex 正则表达式替换日期部分,regex,sed,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' 有几件事需要改变: 您不应该使用-e选项运行sed,该选项用于运行sed脚本 sed中不需要单引号 您应该使用\{和\}来表示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'

有几件事需要改变:

  • 您不应该使用
    -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/'
你可以试试这个:

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\}
-匹配
\u 20180904

[0-9]\{7\}
-匹配
\u 0038849

\u[a-zA-Z0-9]*
-匹配
\u SUPER03

结果是:
A_B_C_D_E_F.txt

这可能适合您(GNU-sed):


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

如果文件名被分配给变量,并且shell是
bash
,则可以避免使用
sed
,直接使用参数展开:

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

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

这是一个真正酷而优雅的解决方案,因为我们更多地使用花哨的编程语言,我们忘记了以前简单的好东西:)。谢谢奥利夫
v="A_B_C_D_E_F_20180904_0038849_SUPER03.txt"
echo "${v%_*_*_*}.${v#*.}"
A_B_C_D_E_F.txt