2011-12-06 19 views
5

Chcę zastąpić TAB s w stdout średnikami, uruchamiając sed z powłoki ZSH.sed wymienić literalne TAB

Rozumiem można normalnie (w innych skorup?) Użyć:

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

Jednak to nie działa na mnie w zsh-shell pod FreeBSD. The \t nie pasuje do tabulatorów. Dlaczego to? Próbowałem również wielu ukośników odwrotnych (do 5).


to działa:

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

, gdzie [TAB] jest rzeczywisty TAB dwuznakowego dodany przez wpisanie Ctrl-V następnie przycisk TAB na mojej klawiaturze.

Odpowiedz

9

Używanie zsh nie ma z tym nic wspólnego. \t jest rozszerzeniem GNU do wyrażeń regularnych używanych w sed. W BSD sed nie masz rozszerzeń, więc musisz użyć dosłownej zakładki.

+0

Dzięki, to naprawdę wyjaśniło mi wszystko! – poplitea

+9

@poplitea Jeśli twój skrypt działa tylko w ksh93, bash lub zsh (w przeciwieństwie do innych wariantów sh, takich jak pdksh, Bourne lub ash), możesz użyć '$ 's/\ t /; /' g' gdzie powłoka rozwija odwrotny ukośnik i 'sed' widzi literalną postać tabulatora. – Gilles

+0

@Gilles: Fantastycznie! Wiedziałem o $(), ale nie o podstawianiu $. Dziękuję bardzo, to ułatwia rozwiązywanie mojego problemu. Powinieneś raczej umieścić to w odpowiedzi, a nie w komentarzu (?). – poplitea

3

Jedną z opcji jest przygotowanie skryptu sed przed czasem z printf.

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

Ale Michael ++ ... Mogą istnieć inne warianty sed, które również obsługują wyjścia w stylu printf, ale z pewnością nie są "standardowe".

0

Jeśli znasz wyjście polecenia jest normalny tekst (tylko wypustki & tekst do druku), można użyć:

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

-E włącza „Extended” wyrażeń regularnych, które mogą zawierać nazwy klas postaci.