使用sed替换多个字符

时间:2013-09-18 06:34:21

标签: regex unix sed

我有一个字符串:

xy-uv>ab-cd-ed-ef-gh<

我需要将其转换为:

xy-uv>ab cd ef gh<

基本上,我需要将-替换为><之间所有字符的空格。

如何使用sed

执行此操作

4 个答案:

答案 0 :(得分:2)

一种方法是:

sed 'h; s/.*>\(.*\)<.*/\1/; s/-/ /g; G; s/\(.*\)\n\(.*>\)\(.*\)\(<.*\)/\2\1\4/'

在多行脚本中,它将是:

h 
s/.*>\(.*\)<.*/\1/
s/-/ /g 
G 
s/\(.*\)\n\(.*>\)\(.*\)\(<.*\)/\2\1\4/

当您只想替换某一行的特定部分时,这是一种常见的模式。它利用了 hold 空间(hG命令)。基本上,您可以复制该行(从模式空间)到保留空间。然后在'&gt;'之间隔离部分和'&lt;',并用''代替' - '。然后使用multiline get G命令将保留空间附加到模式空间。在两者之间将有一个新的行字符(G命令是多行命令)。在最后一行中,我们只需使用和替换元字符\ N(其中N是组号)重新排列两行。

答案 1 :(得分:1)

您可以尝试这个sed脚本:

s/>([^>]+)</\n>\1<\n/g
:loop
s/(\n[>][^ ]+)-([a-z ]*[<]\n?)/\1 \2/g
t loop
s/\n//g

<强>测试

sat:~# sed -r -f b.sed 
xy-uv>ab-cd-ed-ef-gh< 
xy-uv>ab cd ed ef gh<

答案 2 :(得分:1)

awksed更容易,因为您可以在给定字段上进行替换:

$ awk '{gsub(/-/," ",$2)}1' FS='>' OFS='>' file
xy-uv>ab cd ed ef gh<

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;s/(>[^<]*)-([^<]*<)/\1 \2/;ta' file