我想要完成的是取一个文件名,让我们说myfileRE.txt
并返回新文件名myfile.txt
。额外的两个字符总是两个字符,所以我试图做的是:
${filename%??.}
我的想法是“匹配在这段时间之前出现的2个字符并将这些字符撕掉”..很遗憾,它只返回了整个文件名。
我最终这样做了:
${filename%??????}.txt
但这不是很友好,必须有一个更清洁的方法来做到这一点。有什么建议?也许有正则表达式的东西?
答案 0 :(得分:5)
为了从字符串的中间拉出一些东西,你可以使用替换。以下适用于bash:
filename=myfileRE.txt
echo "${filename/??./.}"
这匹配模式“??”。并用“。”代替。它类似于perl
或sed
替换,但它使用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)
$