正则表达式替换

时间:2016-06-19 14:28:42

标签: regex bash shell unix

所以我想替换以下

<duration>89</duration>

与 (预期结果或至少Shoud成为:)

\n<duration>89</duration>

所以基本上替换每个&lt;用\ n&lt;在正则表达式,所以我想。

sed -e 's/<[^/]/\n</g'

只有问题显然会输出

\n<uration>89</duration>

这让我想到了我的问题。我怎样才能告诉正则表达式为一个跟随&lt; (不是/)但是要阻止它取代它以便我能得到我预期的结果吗?

5 个答案:

答案 0 :(得分:1)

试试这个:

sed -e 's/<[^/]/\\n&/g' file

sed -e 's/<[^/]/\n&/g' file
  

&:引用与

匹配的模式空间部分

答案 1 :(得分:1)

使用awk

可以很好地完成
echo '<duration>89</duration>' | awk '1' RS='<' ORS='\n<'
  • RS='<' sets the input record separator to&LT;`
  • ORS='\n<' sets the output record separator to \ n&LT;'
  • 1始终评估为true。没有指定后续操作的真实条件告诉awk打印记录。

答案 2 :(得分:0)

 echo "<duration>89</duration>" | sed -E 's/<([^\/])/\\n<\1/g'

应该这样做。

示例运行

$ echo "<duration>89</duration>
> <tag>Some Stuff</tag>"| sed -E 's/<([^\/])/\\n<\1/g'
\n<duration>89</duration>
\n<tag>Some Stuff</tag>

答案 3 :(得分:0)

echo '<duration>89</duration>' | awk '{sub(/<dur/,"\\n<dur")}1'
\n<duration>89</duration>

答案 4 :(得分:0)

你的陈述是正确的,有一个小问题。 sed取代了整个模式,即使是您放置的任何条件。因此,[^/]条件语句也会被替换。您需要保留此部分,因此您可以尝试以下两个语句中的任何一个:

sed -e 's/<\([^/]\)/\n<\1/g' file

或者如Cyrus所指出的

sed -e 's/<[^/]/\n&/g' file

干杯!