在bash中搜索并替换string中的子字符串

时间:2014-06-10 22:17:35

标签: regex bash sed

我有以下任务: 我必须替换几个链接,但只有以.do

结尾的链接

重要提示:文件中还有其他链接,但它们应保持不变。

<li><a href="MeinKonto.do">Einstellungen verwalten</a></li>

<li><a href="<s:url action='MeinKonto'/>">Einstellungen verwalten</a></li>

所以我必须在.do中搜索链接,然后记下它并记住例如$ a,用

替换整个链接
<s:url action=' '/>

和报价之间的过去$。

我想到了sed,但是据我所知,只搜索整个字符串并将其替换完整。 我还尝试将bash参数扩展与sed结合使用,但引用了引号和变量的问题。

cat  ./src/main/webapp/include/stoBox2.jsp | grep -e '<a href=".*\.do">' | while read a;
do
    b=${a#*href=\"};
    c=${b%.do*};
    sed -i 's/href=\"$a.do\"/href=\"<s:url action=\'$a\'/>\"/g' ./src/main/webapp/include/stoBox2.jsp;
done;

任何想法?

非常感谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

sed -i "s%\(href=\"\)\([^\"]\+\)\.do%\1<s:url action='\2'/>%g" \
    ./src/main/webapp/include/stoBox2.jsp;

您可以使用括号(\(,\))捕捉模式,并在替换模式中使用它 在这里,我捕获的字符串没有任何"但前面有.do\([^\"]\+\)\.do),并且插入时没有.do后缀(\2)。

第二种模式中有/,因此我使用%来分隔表达式而不是传统的/

答案 1 :(得分:1)

sed -i  sed 's#href="\(.*\)\.do"#href="<s:url action='"'\1'"'/>"#g' ./src/main/webapp/include/stoBox2.jsp

使用带括号的模式来获取没有.do的链接,这里单引号和双引号将sed命令与3个部分分开(但实际上是用一个命令连接)以转义文本中的引号。

 's#href="\(.*\)\.do"#href="<s:url action='

 "'\1'"

 '/>"#g'

参数-i用于直接修改您的文件。如果您不想这样做,请将其删除。并使用> tmp将结果保存到tmp文件。