2011-12-06 226 views
5

我想用分號代替stdout中的TAB s,方法是從ZSH shell中運行sedsed替換文字TAB

我明白了一個可以正常(在其他shell?)使用方法:

somecommand | sed 's/\t/;/g' 

然而,這並沒有爲我ZSH殼在FreeBSD下工作。 \t與製表符不匹配。爲什麼是這樣?我也嘗試了多個反斜槓(最多5個)。


這並不工作:

somecommand | sed 's/[TAB]/;/g' 

,其中[TAB]是一個實際的TAB字符數限制,通過輸入Ctrl-V其次是我的鍵盤上的按鍵TAB插入。

回答

9

使用的zsh無關吧。 \t是sed中使用的正則表達式的GNU擴展。在BSD sed上,你沒有擴展名,所以必須使用文字標籤。

+0

謝謝,這真的爲我清除了事情! – poplitea

+9

@poplitea如果你的腳本只能在ksh93的,bash或zsh中運行(而不是其他SH變體,如pdksh程序,Bourne或灰),那麼你可以使用'$「S/\ t /; /」 g'其中shell執行反斜槓擴展,'sed'看到一個文字標籤字符。 – Gilles

+0

@Gilles:太棒了!我知道$(),但不是$''替換。非常感謝,這使我很容易解決我的問題。儘管(?),你可能應該把它放在答案中而不是評論中。 – poplitea

3

一種選擇是用printf的提前準備的時間你的sed腳本。

scr="`printf 's/\t/;/g'`" 
somecommand | sed "$scr" 

但是Michael ++ ...可能還有其他的sed變體也支持printf式轉義,但它肯定不是「標準」。

0

如果你知道命令的輸出是正常的文本(僅標籤&打印文本),你可以使用:

somecommand | sed -E 's/[[:cntrl:]]/;/g' 

-E打開「擴展」的正則表達式,它可以包含字符類的名字。