ksh和AT& T sed,断行匹配模式

时间:2012-04-26 04:48:54

标签: shell unix sed ksh

我需要将'aaa bbb'打破

aaa
bbb

在一行代码中。 在gnused中,我可以:

print 'aaa bbb'  | sed 's/ /\n/g'

在bash,我可以:

echo 'aaa bbb' | sed 's/ '"/`echo \\\n`/"

但是在ksh / zsh中,在AIX中使用at& t sed,这些都不起作用:

print 'aaa bbb' | sed "s/ /`echo -e \\\n`/"
print 'aaa bbb' | sed 's/ '"/`echo \\\n`/"
print 'aaa bbb' | sed "s/ /`echo \\\n`/"

sed中是否有任何解决方法,在一行中?

3 个答案:

答案 0 :(得分:1)

假设该行中只有一个空格:

sed 'h;s/^[^ ]* //;x;s/ [^ ]*$//;G'

要为每个空间执行此操作:(我认为我在此处触发了本地sed中的错误;我无法将上述命令组合在一起)

$ echo aaa bbb ccc def ghi zzz |
> sed -e :s -e h -e 's/ .*$//' -e p -e x -e 's/^[^ ]* //' -e ts -e d
aaa
bbb
ccc
def
ghi
zzz

(你可以看到为什么扩展GNU sed以更好地处理这种情况。)你可以使用保留空间做各种事情,如果使用条件分支(s/.../.../;thereifmatched),甚至可以做更多事情。

答案 1 :(得分:1)

这可能对您有用:

echo -e "aaa bbb ccc\nxxx yyy zzz" |
sed 'G;:a;s/ \+\(.*\(.\)\)/\2\1/;ta;s/.$//'
aaa
bbb
ccc
xxx
yyy
zzz

或者也许:

echo -e "aaa bbb ccc\nxxx yyy zzz" |
sed -e 'G' -e ':a' -e 's/ \+\(.*\(.\)\)/\2\1/' -e 'ta' -e 's/.$//'
aaa
bbb
ccc
xxx
yyy
zzz

答案 2 :(得分:1)

我不确定这是否属于“在一条线上”......

print 'aaa bbb'  | sed 's/ /
/g'

......这是一个单一的命令,我认为我之前已经习惯了(或者SCO Unix使用的)...