sử dụng sed với ký hiệu (&)


19

Tôi đang sử dụng sed để tìm và thay thế các mẫu trong các tệp SAS mà tôi có thay vì thay đổi chúng riêng lẻ. Vấn đề là tôi đang cố gắng thay thế các biến vĩ mô và khi tôi sử dụng ký hiệu và nó không được xử lý chính xác.

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

Bất cứ khi nào tôi chạy lệnh này, nó dường như nối thêm và làm tất cả các loại nội dung thú vị với văn bản gốc.

Câu hỏi: Làm cách nào để thay thế văn bản có chứa ký hiệu bằng lệnh sed?


6
&là một ký tự đặc biệt vì vậy nó cần phải được thoát khi được sử dụng trong RHS - trong trường hợp của bạn, bạn phải chạy 's/user=&uid./user=\&sysuserid./g'mặc dù tôi nghi ngờ bạn cũng cần thoát dấu chấm trong LHS để khớp với một dấu chấm theo nghĩa đen để bạn thực sự cần's/user=&uid\./user=\&sysuserid./g'
don_crissti

1
có, '&' ở bên phải về cơ bản có nghĩa là "mọi thứ khớp với bên trái", vì vậy hãy thoát khỏi nó bằng '\'. Bạn nên làm cho câu trả lời, thay vì chỉ là một nhận xét.
Edward Falk

tôi đã không phải thoát khỏi giai đoạn đầu tiên ... chỉ cần một người đứng đầu là tò mò :)
lucasdavis500

Câu trả lời:


25

&là đặc biệt trong văn bản thay thế: nó có nghĩa là toàn bộ phần đầu vào được khớp với mẫu hình, vì vậy những gì bạn đang làm ở đây thay thế user=&uidXbằng user=user=&uidXsysuserid.. Để chèn một dấu và thực tế trong văn bản thay thế, sử dụng \&.

Một điều khác có vẻ sai là .trong mẫu tìm kiếm là viết tắt của bất kỳ ký tự nào (ngoại trừ một dòng mới), nhưng .ở cuối văn bản thay thế là một dấu chấm. Nếu bạn muốn chỉ thay thế chuỗi ký tự user=&uid., hãy bảo vệ .dấu gạch chéo ngược.

sed -e 's/user=&uid\./user=\&sysuserid./g'

Nếu bạn muốn thay thế bất kỳ một ký tự nào và giữ nguyên kết quả, hãy đặt ký tự đó vào một nhóm và sử dụng \1thay thế để tham chiếu đến nhóm đó.

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

Trong thực tế, do sự lặp lại giữa văn bản gốc và thay thế, bạn vẫn nên sử dụng các nhóm:

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

tức là thay thế ubởi sysusergiữa user=&và giữa id..


bạn có thể giải thích các nhóm?
lucasdavis500

2
@ lucasdavis500 Một nhóm xác định một phần của mẫu. Nó được phân định bằng dấu gạch chéo ngược. Ví dụ: \(user=&\)một mẫu khớp user&và lưu trữ chuỗi khớp dưới dạng một nhóm (nhóm số 1 vì đó là nhóm đầu tiên trong mẫu). Sau đó, trong phần thay thế \1được thay thế bằng chuỗi được lưu trữ cho nhóm số 1.
Gilles 'SO- ngừng trở nên xấu xa'

ý bạn là (người dùng = &) lưu trữ người dùng = &, không phải người dùng &?
lucasdavis500

@ lucasdavis500 Tôi không hiểu bình luận của bạn. Ký tự =trong biểu thức chính quy và trong văn bản thay thế là viết tắt của chính nó, do đó user=&chỉ khớp user=&user=&trong văn bản thay thế mang lại kết quả user=là một phần của dòng khớp với biểu thức chính quy.
Gilles 'SO- ngừng trở nên xấu xa'

1
@ lucasdavis500 Nhân =vật không có bất kỳ ý nghĩa đặc biệt nào. user=&trong văn bản thay thế tạo ra user=theo sau bởi văn bản phù hợp ban đầu. user=\&trong văn bản thay thế tạo rauser=&
Gilles 'SO- ngừng trở nên xấu xa'
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.