我有一个字符串:
xy-uv>ab-cd-ed-ef-gh<
我需要将其转换为:
xy-uv>ab cd ef gh<
基本上,我需要将-
替换为>
和<
之间所有字符的空格。
如何使用sed
?
答案 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 空间(h
,G
命令)。基本上,您可以复制该行(从模式空间)到保留空间。然后在'&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)
awk
比sed
更容易,因为您可以在给定字段上进行替换:
$ 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