我有以下任务: 我必须替换几个链接,但只有以.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;
任何想法?
非常感谢。
答案 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文件。