我得到了这个x.xx.xxx.xxxx.api-6.8.25-SNAPSHOT.jar
文件名,我想将其更改为x.xx.xxx.xxxx.api_6.8.25.SNAPSHOT.jar
。使用sed
,我想到了这个:
FILENAME=$(sed 's/-(?=[w])/_/g' <<< "$FILENAME")
regex模式在指向-
s时似乎是正确的,但是当我的脚本运行时,不会对我的字符串进行任何更改。我在这里缺少什么?我怎么能有多次换人?将第一个破折号改为下划线,第二个改为点?
我建议:
echo 'x.xx.xxx.xxxx.api-6.8.25-SNAPSHOT.jar' | sed 's/-/_/; s/-/./'
输出:
x.xx.xxxx.xxxx.api_6.8.25.SNAPSHOT.jar
不调用任何外部实用程序的纯bash解决方案:
fn='xx.xxx.xxxx.api-6.8.25-SNAPSHOT.jar`
fn="${fn/-/_}" # replace first - by _
fn="${fn/-/.}" # replace next - by .
echo "$fn"
xx.xxx.xxxx.api_6.8.25.SNAPSHOT.jar
您可以使用
FILENAME=$(sed -E 's/(.*)-([0-9.]+)-/1_2./' <<< "$FILENAME")
请参阅在线演示。
详细信息:
-E
启用POSIX ERE语法(.*)-([0-9.]+)-
-一个正则表达式,用于匹配并捕获组1中的任何零个或多个字符,然后是-
,然后是捕获到组2中的一个或多个子数字或点,然后是一个-
1_2.
是替换,组1、_
、组2和一个.