Regex 正则表达式替换日期部分
我有一个像这样的文件 A_B_C_D_E_F_20180904_0038849_SUPER03.txt 我只想提取A_B_C_D_E_F.txt 我的尝试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正则表达式语法中的量词 替换文本中不需要通
echo A_B_C_D_E_F_20180904_0038849_SUPER03.txt |sed -e 's/'_[0-9]{8}_.*'/'*.txt'/g'
有几件事需要改变:
- 您不应该使用
选项运行sed,该选项用于运行sed脚本-e
- 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