如何使用sed来查找和替换具有多个字符串的模式



我得到了这个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和一个.

相关内容

  • 没有找到相关文章

最新更新