如何使用sed更改部分字符串?

时间:2014-01-06 09:34:51

标签: sed sh

我有一个文件data.txt,其中包含以下字符串:

  
    

文本共1.1.1- SNAPSHOT.jar

         

文本特殊共2.1.2-SNAPSHOT.jar

         

一些文本变-1.1.1- SNAPSHOT.jar

         

文本另一个变文本-3,3,3- SNAPSHOT.jar

  

我想将所有text-something-digits-something.jar更改为text-something-5.0.jar

这是我的脚本sed(GNU sed版本4.2.1 ),但它不起作用,我不知道为什么:

#!/bin/bash
for t in ./data.txt
do
    sed -i "s/\(text-[a-z]*-(\d|\.)*\).*\(.jar\)/\15.0\2/" ${t}
done

我的sed用法有什么问题?

4 个答案:

答案 0 :(得分:1)

这个awk

怎么样?
awk '/^text/ {sub(/[0-9].*\./,"5.0.")}1'
text-common-5.0.jar
text-special-common-5.0.jar
some-text-variant-1.1.1-SNAPSHOT.jar
text-another-variant-text-5.0.jar

text-something-digits-something.jartext-something-5.0.jar
等变digits-someting5.0
它还负责仅从text

开始更改行

答案 1 :(得分:0)

我认为更简单的方法可能就足够了:sed -r -e 's/(text-(.*-)?common-)([0-9\.]+)(-.*\.jar)/\15.0\4/' < your_data

用perl说同样的话的另一种方式:perl -pe 's/(text-(?:(.*-))*common-)([\d\.]+)(-.*\.jar)/${1}1.5${4}/' < your_data

答案 2 :(得分:0)

使用sed:

sed '/^text-/ s/-[0-9.]*-/-5.0-/' file

答案 3 :(得分:0)

#!/bin/bash
for t in ./data.txt
do
    sed -i '/^text-/ s/[.0-9]\{1,\}-something\(\.jar\)$/5.0\2/' ${t}

    # for "any" something
    #sed -i '/^text-/ s/[.0-9]\{1,\}-[^?]\{1,\}\(\.jar\)$/5.0\2/' ${t}
done

选择以文本开头的字符串并更改数字值