我有一个字符串:
xy-uv>ab-cd-ed-ef-gh<
我需要将其转换为:
xy-uv>ab cd ef gh<
基本上,我需要在和-
之间的所有字符中用空格替换。>
<
我怎样才能做到这一点sed
?
一种方法是:
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 是组号)简单地重新排列这两行。
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<
这比在给定字段上进行替换要容易awk
得多:sed
$ awk '{gsub(/-/," ",$2)}1' FS='>' OFS='>' file
xy-uv>ab cd ed ef gh<
这可能对您有用(GNU sed):
sed -r ':a;s/(>[^<]*)-([^<]*<)/\1 \2/;ta' file