2012-09-04 5 views
7

Gần đây tôi phát hiện ra rằng sed biểu hiện tốt công việc này đơn giản trên Linux hoặc dưới Cygwin nhưng không thành công trên máy Mac với một lỗi "nhãn không xác định":sed "nhãn không xác định" trên hệ điều hành MacOS

$ sed '/SUCCESSFUL/d ; /\[java\]/!b label; s/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d; :label /^\s*$$/d; s/^/monitor: /' 
sed: 1: "/SUCCESSFUL/d ; /\[java ...": undefined label 'label; s/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d; :label /^\s*$$/d; s/^/monitor: /' 

sed trên hệ điều hành MacOS là một Biến thể BSD với các tùy chọn khác với đối tác GNU. Tuy nhiên man sed cho biết rõ ràng phiên bản MacOS của sed hỗ trợ nhãn, vậy tại sao lỗi này và quan trọng nhất là cách giải quyết nó?

Trả lời

3

Tên của nhãn chấm dứt bằng dòng mới đầu tiên, chứ không phải ở dấu chấm phẩy. Có hai cách dễ dàng để giải quyết vấn đề. Thêm dòng mới theo nghĩa đen:

sed '/SUCCESSFUL/d 
    /\[java\]/!b label 
    s/\s\+\[java\]// 
    /^\s*$$/d; /Compiling/!d 
    :label 
    /^\s*$$/d 
    s/^/monitor: /' 

Hoặc sử dụng nhiều -e lựa chọn:

sed -e '/SUCCESSFUL/d ; /\[java\]/!b label' \ 
    -e 's/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d' \ 
    -e':label' -e'/^\s*$$/d; s/^/monitor: /' 
2

Có một loạt câu hỏi tương tự trên SO nhưng hầu hết trong số đó là do hành vi của -i khác nhau giữa các nền tảng, vì vậy điều này là khác nhau.

Trong trường hợp này, vấn đề khá đơn giản: có vẻ như tham chiếu nhãn chỉ có thể quay lại trong phiên bản BSD sed, trong khi phiên bản GNU cho phép sử dụng tham chiếu chuyển tiếp. Đó là trên MacOS, số :label phải xuất hiện trước số b label.

Giải pháp là viết lại biểu thức để xác định nhãn trước chi nhánh hoặc trong trường hợp biểu thức trên nhận ra nhánh là một loại "nếu mẫu này không hiện diện ... hãy nhảy lên". Trong trường hợp này, biểu thức có thể được mở rộng để không cần nhãn ở nơi đầu tiên:

sed '/SUCCESSFUL/d ; /\s+\[java\]\s*/d; /\[java\]/s/\s\+\[java\]//; /Compiling/!d; /^\s*$$/d; s/^/monitor: /' 
+0

+1 và Good catch. Nó cũng giúp hình dung các vấn đề như mã thụt lề, thay vì với một-lót-itis :-) Chúc may mắn. – shellter