Thoát khỏi nhiều backticks trong một cuộc gọi sed


8

Tôi cần thực hiện tìm kiếm và thay thế lặp đi lặp lại trong một số câu lệnh SQL:

Từ:

CREATE TABLE `Old_Name` (

Đến:

ALTER TABLE `Old_Name` RENAME TO `New_Name`

Các truy vấn trên có chứa backticks `. Tôi đã thử làm như sau

sed -i -r "s/CREATE TABLE \`$search\` \(/ALTER TABLE \`$search\` RENAME TO \`$replacement\`/g" /query.txt;

Nó tạo ra một enter trên dòng lệnh thay thế. Nhưng nếu tôi thêm một khoảng trống phía sau $replacement, nó sẽ chạy bình thường. Nhưng tôi không muốn không gian sau New_Name.

Lưu ý, tôi không biết liệu điều này thực sự gây ra bởi backticks hay nó có thể là một vấn đề nội suy tên biến. Bất kể trường hợp nào, làm thế nào tôi có thể giải quyết vấn đề này?


Bạn có thể cung cấp thêm chi tiết về kịch bản của bạn? Làm thế nào để bạn gán giá trị cho $search$replacement?
cuonglm

@Gnouc, chuỗi tìm kiếm và thay thế được trích xuất từ ​​danh sách ánh xạ tương tự như thế này
Câu hỏi tràn vào

Câu trả lời:


10

Để giảm mức thoát xuống mức tối thiểu, tôi đề nghị sử dụng các trích dẫn đơn với sed, như trong

sed 's/pattern/repl/g'

(trong các trích dẫn duy nhất, bạn có thể tự do sử dụng backtick mà không sợ hãi và không thoát ra ngoài).
Nếu bạn cần sử dụng biến shell trong sedtập lệnh, hãy ghép các dấu ngoặc đơn và dấu ngoặc kép như trong ví dụ sau

var="bbb"
thing=foo
sed 's/aaa'"${var}"'ccc/some'"${thing}"'else/g'

đó có thể được xem tốt hơn như là sự kết hợp sau đây

's/aaa' + "${var}" + 'ccc/some' + "${thing}" + 'else/g'

Vâng đúng vậy. Các dấu ngoặc đã giải quyết nó. Cảm ơn!
Câu hỏi tràn

Tôi đã cố gắng sử dụng dấu ngoặc đơn, nhưng (nó gây ra vấn đề. Vẫn cần phải thoát khỏi backticks mặc dù.
Câu hỏi tràn

@QuestionOverflow: trong GNU sed, nếu bạn sử dụng -rtùy chọn, các dấu ngoặc tròn được sử dụng để nhóm. Vì vậy, không sử dụng -rtùy chọn hoặc sử dụng thay thế \(cho dấu ngoặc tròn.
enzotib
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.