2013-05-19 33 views
50

Tôi chạy một số lệnh thay thế làm lõi của colorize script for maven. Một trong các lệnh sed sử dụng cụm từ thông dụng hoạt động trong vỏ dưới dạng discussed here. Triển khai hiện tại (không hoạt động) có thể được tìm thấy here.lỗi sed: "tham chiếu không hợp lệ 1 trên lệnh 's' RHS"

Khi tôi bao gồm một trong những biến thể của lệnh vào hành vi kịch bản khác nhau xảy ra:

Biến thể 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g" 

Thích nghi với kịch bản:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \ 

Lỗi: Cô ấy sẽ xuất ra cùng một thông tin như thể tôi sẽ nhập $ sed. Lạ thật !?


Biến thể 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g" 

Thích nghi với kịch bản:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \ 

Lỗi:

sed: -e expression #7, char 59: invalid reference \1 on `s' command's RHS

+5

Trong trường hợp của tôi, tôi đã kết hợp một '-i' (chỉnh sửa trong lựa chọn nơi) với '-re', kết quả là' -ire' (để '-i' đang tiêu thụ đoạn' re' làm đối số 'SUFFIX' của nó và do đó chế độ regex mở rộng không được kích hoạt); thay đổi nó thành '-i -re' đã khắc phục vấn đề. –

+0

Cũng cần lưu ý rằng các dấu nháy đơn ''' và dấu ngoặc kép '' 'được xử lý hơi khác một chút, đặc biệt khi giải thích' $ vars'. Ví dụ: 'sudo sh -c" sed-r -i' s/(^. + _supplicant.conf)/\ 1 $ {MTXT}/'/ etc/network/interfaces "' hoạt động, nhưng: 'sudo sh -c' sed-r -i" s/(^.+_ supplicant.conf)/\ 1 $ {MTXT}/"/ etc/network/interfaces'' không. – not2qubit

Trả lời

15

Bạn không cần phải thực sự nắm bắt để làm việc? tức là cho biến thể 2:

-e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \ 

(Lưu ý: chưa được kiểm tra)

+22

Tùy chọn' -r' để sed có vẻ là cần thiết để tham chiếu ngược hoạt động. Ví dụ: 'sed -e 's/([[ : digit:]])/là một số/''công trình nhưng' sed -e' s/([[: chữ số:]])/\ 1 là một chữ số/'tạo ra lỗi gốc mà không có' -r' để sed . ** LƯU Ý: ** lời gọi đầu tiên của các tìm kiếm sed cho một chữ '()' và ** không phải là ** một nhóm chụp. –

+0

Nhận xét bên dưới câu trả lời thực sự là câu trả lời. – miroxlav

+0

@AndrewFalanga bạn nên đăng nhận xét của mình làm câu trả lời – sanmai

4

Bạn cần thoát khỏi / sau .

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g" 

Hoặc nếu bạn không muốn phải lo lắng về việc thoát, sử dụng |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g" 

EDIT:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g" 
+0

Âm thanh hợp lý. Nhưng nó không hoạt động trong bối cảnh của kịch bản. – JJD

+0

Kiểm tra chỉnh sửa của tôi, có thể nó có thể giúp – slackmart

+0

Rất tiếc. Chỉnh sửa làm tăng lỗi: 'sed: -e expression # 7, char 58: Kết thúc phạm vi không hợp lệ'. @Denis 'trả lời hoạt động. – JJD

36

Lỗi này phổ biến đối với dấu ngoặc đơn không được thoát. Hãy trốn thoát và thử lại.


Ví dụ:

/^$/b 
:loop 
$!{ 
N 
/\n$/!b loop 
} 
s/\n(.)/\1/g 

nên được thoát với backslashes trước mỗi ngoặc:

/^$/b 
:loop 
$!{ 
N 
/\n$/!b loop 
} 
s/\n\(.\)/\1/g 
+0

Chú ý, nếu bạn sử dụng '-r' bạn không phải thoát khỏi dấu ngoặc đơn. –

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