2012-10-15 39 views
5

Tôi muốn lưu trữ một phần cụ thể của kết quả phù hợp làm biến được sử dụng để thay thế sau này. Tôi muốn giữ điều này trong một lớp lót thay vì tìm biến tôi cần trước khi tay.Sử dụng trình giữ chỗ/biến trong lệnh sed

khi cấu hình apache, và sử dụng mod_rewrite, bạn có thể specificy phần cụ thể của mô hình được sử dụng như các biến, như thế này:

RewriteRule ^www.example.com/page/(.*)$ http://www.example.com/page.php?page=$1 [R=301,L] 

một phần của mô hình phù hợp đó là chứa bên trong ngoặc được lưu giữ như $ 1 để sử dụng sau. Vì vậy, nếu url là www.example.com/page/home, nó sẽ được thay thế bằng www.example.com/page.php?page=home. Vì vậy, phần "nhà" của trận đấu được lưu trong $ 1 vì nó là một phần của mẫu bên trong dấu ngoặc đơn.

Tôi muốn có chức năng này với lệnh sed, tôi cần tự động thay thế nhiều chuỗi trong tệp kết xuất SQL, để thêm bảng thả nếu tồn tại các lệnh trước mỗi bảng tạo, nhưng tôi cần biết tên bảng cần làm này, vì vậy nếu các tập tin dump chứa một cái gì đó như:

... 
CREATE TABLE `orders` 
... 

tôi cần phải chạy một cái gì đó như:

cat dump.sql | sed "s/CREATE TABLE `(.*)`/DROP TABLE IF EXISTS $1\N CREATE TABLE `$1`/g" 

để có được những kết quả của:

... 
DROP TABLE IF EXISTS `orders` 
CREATE TABLE `orders` 
... 

Tôi đang sử dụng cú pháp mod_rewrite trong lệnh sed làm ví dụ logic về những gì tôi đang cố gắng thực hiện.

Mọi đề xuất?

Trả lời

8
sed '/CREATE TABLE \([^ ]*\)/ s//DROP TABLE IF EXISTS \1; &/' 

Tìm câu lệnh CREATE TABLE và ghi tên bảng. Thay thế nó bằng 'DROP TABLE IF EXISTS' và tên bảng, cộng với dấu chấm phẩy để chấm dứt câu lệnh và một bản sao của những gì đã được so khớp để giữ nguyên câu lệnh CREATE TABLE.

Đây là ký hiệu cổ điển sed. Vì bạn đang sử dụng bash, có khả năng bạn đang sử dụng GNU sed và sẽ cần phải thêm --posix để sử dụng ký hiệu đó hoặc bạn sẽ cần phải điều chỉnh tập lệnh để sử dụng các quy tắc không chuẩn của sed của GNU. Tôi cũng không cố gắng chèn một dòng mới vào đầu ra. Bạn có thể làm điều đó với GNU sed nếu nó đủ quan trọng đối với bạn.

Các điểm chính là các dấu ngoặc đơn (theo kiểu cổ điển cần được thoát bằng dấu gạch chéo ngược) là cơ chế nắm bắt và dấu chéo ngược là cơ chế thay thế.

+0

Cảm ơn lời giải thích này, nó đã trả lời hoàn toàn câu hỏi của tôi. –

6
sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" dump.sql 

kiểm tra:

kent$ cat t.txt 

CREATE TABLE `orders` 
... 

CREATE TABLE `foo` 
... 
... 

CREATE TABLE `bar` 
... 


kent$ sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" t.txt 

DROP TABLE IF EXISTS `orders` 
CREATE TABLE `orders` 
... 

DROP TABLE IF EXISTS `foo` 
CREATE TABLE `foo` 
... 
... 

DROP TABLE IF EXISTS `bar` 
CREATE TABLE `bar` 
... 
+0

Cảm ơn, đây là một ví dụ rõ ràng tuyệt vời. –

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