2012-04-26 46 views
0

我需要打破 'AAA BBB' 變成KSH和AT&T的sed,打破匹配圖案

aaa 
bbb 

在一行代碼行。 在gnused,我可以:

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

在bash,我可以:

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

但在KSH/zsh中,與&牛逼SED在AIX,沒有這個工程:

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

在sed中有任何解決方法,在一行中?

回答

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)你可以做各種事情的保留空間,甚至更多。

+0

嗯,如果我需要像'aaa bbb ccc ddd ...'這樣的長線做什麼怎麼辦? – MeaCulpa 2012-04-26 05:06:46

+0

如果你使用'ksh'並使用shell變量,你實際上可以完全避免'sed':'$ {line#*}'是第一個空格後面的東西,'$ {line%*}'是第一個空格之前的東西。將'#'或'%'加倍以使用* last *空格。 – geekosaur 2012-04-26 05:08:16

+0

@MeaCulpa,見編輯答案。或者,你可能會更快樂,而不是尋找;這遠不是我寫的最邪惡的「sed」,但是超越大多數人的邪惡觀念並不需要太多。 – geekosaur 2012-04-26 05:29:14

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 
1

我不知道這是否有資格作爲 '在同一行' 或不...

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

...這是一個單一的命令,我認爲我已經在& tsed(或任何SCO Unix使用的)之前...

+0

是的,這是無固定sed和shell版本中最堅實的soluiton。我在問一句話,我的朋友需要在一些奇怪的自動化套裝中使用,這種套裝只是簡單地分成多行。無論如何,我說服他進入awk的輕鬆境界。謝謝。 – MeaCulpa 2012-04-27 14:15:00

+0

如果調用需要在一行中,您可以將其包裝在shell函數中。他在awk中使用了什麼解決方案? – 2012-04-27 17:01:19