lỗi sed: "tham chiếu không hợp lệ \ 1 trên RHS của lệnh" s "


103

Tôi chạy một số lệnh thay thế làm cốt lõi của tập lệnh tô màu cho maven . Một trong các sedlệnh sử dụng biểu thức chính quy hoạt động được tìm thấy trong shell như được thảo luận ở đây . Việc triển khai hiện tại (không hoạt động) có thể được tìm thấy ở đây .

Khi tôi đưa một trong các biến thể của lệnh vào tập lệnh, hành vi khác sẽ xảy ra:

Biến thể 1:

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

Điều chỉnh theo kịch bản:

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

Lỗi: Trình bao xuất ra thông tin giống như khi tôi nhập $ sed. Kỳ lạ !?


Biến thể 2:

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

Điều chỉnh theo kịch bản:

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

Lỗi:

biểu thức sed: -e # 7, char 59: tham chiếu không hợp lệ \ 1 trên RHS của lệnh `s '


10
Trong trường hợp của tôi, tôi đã kết hợp -i(tùy chọn chỉnh sửa tại chỗ) với -re, kết quả là -ire(vì vậy điều đó -iđang sử dụng rephân đoạn làm SUFFIXđối số của nó và do đó chế độ regex mở rộng không được bật); thay đổi nó để -i -rekhắc phục sự cố.
Janaka Bandara

Cũng cần lưu ý rằng dấu ngoặc kép 'và dấu ngoặc kép "được xử lý hơi khác nhau, đặc biệt là khi diễn giải $vars. Ví dụ: sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"works, but: sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'does not.
not2qubit

Câu trả lời:


51

Bạn không cần phải thực sự nắm bắt để điều đó hoạt động? tức là đối với biến thể 2:

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

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

Nếu không có đối số -r, tham chiếu ngược (như \ 1) sẽ không hoạt động.


42
Các -rtùy chọn để xuất hiện sed là cần thiết cho việc back-tài liệu tham khảo để làm việc. Ví dụ: sed -e 's/([[:digit:]])/is a digit/'hoạt động nhưng sed -e 's/([[:digit:]])/\1 is a digit/tạo ra lỗi ban đầu mà không -rphải sed. LƯU Ý: lệnh gọi đầu tiên của sed tìm kiếm một nghĩa đen (<digit>)không phải là một nhóm bắt.
Andrew Falanga

Bình luận bên dưới câu trả lời thực sự là một câu trả lời. Có thể bạn có thể chỉnh sửa câu trả lời của mình để phản ánh nó.
miroxlav

@AndrewFalanga bạn nên đã gửi nhận xét của bạn như một câu trả lời
sanmai

2
Đừng quên sai lầm của tôi là sử dụng -irethay vì sử dụng -ri. Vấn đề đặt hàng :-)
m3nda

54

Lỗi này thường xảy ra đối với các dấu ngoặc đơn không được thoát. Thoát khỏi chúng và thử lại.


Ví dụ:

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

Phải được thoát bằng dấu gạch chéo ngược trước mỗi dấu ngoặc đơn:

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

6
Chú ý, nếu bạn sử dụng, -rbạn không cần phải thoát khỏi dấu ngoặc đơn.
qräbnö

13

Nếu tùy chọn -r/ --regexp-extendedkhông được cung cấp, thì dấu ngoặc đơn bắt buộc phải được thoát.


5

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 lo lắng về việc thoát, hãy sử dụng |

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

BIÊN TẬP:

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

Nghe hợp lý. Nhưng nó không hoạt động trong ngữ cảnh của kịch bản.
JJD

Lấy làm tiếc. Tóm lược sửa đổi làm tăng lỗi: sed: -e expression #7, char 58: Invalid range end. Câu trả lời của @Denis hoạt động.
JJD

2
Được rồi, hãy +1 cho câu trả lời của
@Denis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.