在unix bash中搜索并替换字符串

时间:2012-05-23 14:02:47

标签: regex bash replace

我对正则表达式不太满意,我需要搜索

< anyword />并与<anyword></anyword>

重新对话

<book/><book></book>

4 个答案:

答案 0 :(得分:3)

听起来你正试图用正则表达式解析XML,这通常是一个坏主意 - XML比最初看起来要复杂得多(当你需要用{{1}替换<a b="c"/>时会发生什么那么非ASCII元素名称怎么样?) - 但如果你确定你所描述的正是你所需要的,那么你可以写:

<a b="c"></a>

或:

perl -pe 's{<(\w+)/>}{<$1></$1>}g' < input_file > output_file

答案 1 :(得分:1)

使用

sed -i 's|<\([[:alpha:]][[:alpha:]]*\)/>|<\1></\1>|g' $input_file

在线更改文件(-i的用途)。小心:-i是GNU扩展。

要符合POSIX并且内联编辑文件(在任何* IX系统上),请使用:

echo '/<[[:alpha:]][[:alpha:]]*\/>/g\
s/<\([[:alpha:]][[:alpha:]]*\)\/>/<\1><\/\1>/g
wq' | ed $input_file

请参阅sededregular expressions上的POSIX标准。

答案 2 :(得分:0)

与您的代码匹配的正则表达式将是:

<(\w+)/>

通过使用捕获组,您可以像这样创建新标记:

<\1></\1>

答案 3 :(得分:0)

这可能对您有用:

echo '<book/>' | sed 's|<\([^/]*\)/>|<\1></\1>|'
<book></book>