如何在bash中扩展文件名之前提取最后2个字符?

时间:2013-09-12 17:36:35

标签: regex bash ksh

我想要完成的是取一个文件名,让我们说myfileRE.txt并返回新文件名myfile.txt。额外的两个字符总是两个字符,所以我试图做的是:

${filename%??.}

我的想法是“匹配在这段时间之前出现的2个字符并将这些字符撕掉”..很遗憾,它只返回了整个文件名。

我最终这样做了:

${filename%??????}.txt

但这不是很友好,必须有一个更清洁的方法来做到这一点。有什么建议?也许有正则表达式的东西?

3 个答案:

答案 0 :(得分:5)

为了从字符串的中间拉出一些东西,你可以使用替换。以下适用于bash:

filename=myfileRE.txt
echo "${filename/??./.}"

这匹配模式“??”。并用“。”代替。它类似于perlsed替换,但它使用shell模式匹配而不是正则表达式。

答案 1 :(得分:5)

Jordanm的方法可能是要走的路,但只是为了变化

echo "${filename%%??.*}.${filename#*.}"

答案 2 :(得分:-1)

不确定bash正则表达式是如何工作的,下面三个简单的示例正则表达式将捕获2个字符之前和之后。第1组和第1组然后才加入2。

 # ^(.+?)..(\.[^.]+)$

 ^
 ( .+? )         # (1)
 . .
 ( \. [^.]+ )    # (2)
 $ 

 ------------------------

 # ^(.+?)[^.]{2}(\.[^.]+)$     

 ^
 ( .+? )         # (1)
 [^.]{2} 
 ( \. [^.]+ )    # (2)
 $ 

 ------------------------

 # ^(.+?)[a-zA-Z]{2}(\.[^.]+)$    

 ^
 ( .+? )         # (1)
 [a-zA-Z]{2} 
 ( \. [^.]+ )    # (2)
 $