2011-12-06 33 views
5

Tôi muốn thay thế TAB s trong stdout bằng dấu chấm phẩy, bằng cách chạy sed từ vỏ ZSH.sed thay thế chữ TAB

Tôi hiểu người ta có thể bình thường (trong vỏ khác?) Sử dụng:

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

Tuy nhiên, điều này không làm việc cho tôi trong ZSH vỏ dưới FreeBSD. Số \t không khớp với các trình lập bảng. Tại sao điều này? Tôi cũng đã thử nhiều dấu gạch chéo ngược (tối đa 5).


này không làm việc:

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

, nơi [TAB] là một TAB ký tự là thực tế, chèn bằng cách nhập Ctrl-V tiếp theo là nút TAB trên bàn phím của tôi.

Trả lời

9

Sử dụng zsh không liên quan gì đến nó. Các \t là một phần mở rộng GNU để các biểu thức thông thường được sử dụng trong sed. Trên một BSD sed, bạn không có phần mở rộng, vì vậy phải sử dụng tab chữ.

+0

Cảm ơn, điều đó thực sự đã giải quyết mọi thứ đối với tôi! – poplitea

+9

@poplitea Nếu tập lệnh của bạn chỉ chạy trong ksh93, bash hoặc zsh (trái ngược với các biến thể sh khác như pdksh, Bourne hoặc tro), thì bạn có thể sử dụng '$ 's/\ t /; /' g' trong đó shell làm mở rộng dấu gạch chéo ngược và 'sed' thấy ký tự tab theo nghĩa đen. – Gilles

+0

@Gilles: Tuyệt vời! Tôi biết $(), nhưng không phải là $ '' thay thế. Cảm ơn bạn rất nhiều, điều này làm cho nó dễ dàng giải quyết vấn đề của tôi. Có lẽ bạn nên đặt câu trả lời này vào câu trả lời chứ không phải là bình luận, mặc dù (?). – poplitea

3

Một tùy chọn là chuẩn bị tập lệnh sed của bạn trước thời hạn với printf.

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

Nhưng Michael ++ ... Có thể có các biến thể sed khác cũng hỗ trợ thoát kiểu printf, nhưng chắc chắn không phải là "chuẩn".

0

Nếu bạn biết đầu ra của lệnh là văn bản bình thường (chỉ có tab & văn bản in), bạn có thể sử dụng:

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

-E bật biểu thức thông thường "mở rộng", có thể chứa tên lớp nhân vật.

Các vấn đề liên quan