0

我有一个字符串:

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

我需要将其转换为:

xy-uv>ab cd ef gh<

基本上,我需要在和-之间的所有字符中用空格替换。><

我怎样才能做到这一点sed

4

4 回答 4

2

一种方法是:

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

在多行脚本中,它将是:

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

当您只想对行的特定部分进行替换时,这是一种常见的模式。它利用了保持空间(h,G命令)。基本上,您将行(从模式空间)复制到保留空间。然后隔离'>'和'<'之间的部分,并将'-'替换为''。然后使用 multiline getG命令将保持空间附加到模式空间。中间会有一个换行符(G命令是多行命令)。在最后一行中,我们使用和替换元字符 \N(其中 N 是组号)简单地重新排列这两行。

于 2013-09-18T07:06:45.227 回答
1

You can try this sed script :

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

Test:

sat:~# sed -r -f b.sed 
xy-uv>ab-cd-ed-ef-gh< 
xy-uv>ab cd ed ef gh<
于 2013-09-18T07:14:22.743 回答
1

这比在给定字段上进行替换要容易awk得多:sed

$ awk '{gsub(/-/," ",$2)}1' FS='>' OFS='>' file
xy-uv>ab cd ed ef gh<
于 2013-09-18T09:34:26.670 回答
0

这可能对您有用(GNU sed):

sed -r ':a;s/(>[^<]*)-([^<]*<)/\1 \2/;ta' file
于 2013-09-18T09:45:59.600 回答