2011-09-10 32 views
13

Tôi có một tập tin mà trông như thế này:sử dụng sed để sao chép dòng và xóa ký tự từ các bản sao

@"Afghanistan.png", 
@"Albania.png", 
@"Algeria.png", 
@"American_Samoa.png", 

Tôi muốn nó trông như thế này

@"Afghanistan.png", 
@"Afghanistan", 
@"Albania.png", 
@"Albania", 
@"Algeria.png", 
@"Algeria", 
@"American_Samoa.png", 
@"American_Samoa", 

tôi nghĩ rằng tôi có thể sử dụng sed để làm điều này nhưng tôi không thể tìm ra cách để lưu trữ một cái gì đó trong một bộ đệm và sau đó sửa đổi nó.

Tôi thậm chí có sử dụng đúng công cụ không?

Cảm ơn

Trả lời

11

Điều này khá dễ làm với sed và bạn thậm chí không cần sử dụng không gian lưu trữ (bộ đệm phụ trợ). Căn cứ vào tập tin input dưới đây:

$ cat input 
@"Afghanistan.png", 
@"Albania.png", 
@"Algeria.png", 
@"American_Samoa.png", 

bạn nên sử dụng lệnh này:

sed 's/@"\([^.]*\)\.png",/&\ 
@"\1",/' input 

Kết quả:

$ sed 's/@"\([^.]*\)\.png",/&\ 
@"\1",/' input 
@"Afghanistan.png", 
@"Afghanistan", 
@"Albania.png", 
@"Albania", 
@"Algeria.png", 
@"Algeria", 
@"American_Samoa.png", 
@"American_Samoa", 

lệnh này chỉ là một lệnh thay thế (s///). Nó khớp với bất kỳ thứ gì bắt đầu bằng @" theo sau là các ký tự không có dấu chấm ([^.]*) và sau đó là .png",. Ngoài ra, nó khớp với tất cả các ký tự không phải là dấu chấm trước .png", bằng cách sử dụng các dấu ngoặc ôm nhóm \(\), vì vậy chúng tôi có thể nhận được kết quả phù hợp của nhóm này. Vì vậy, đây là biểu thức chính quy được thay thế:

@"\([^.]*\)\.png", 

Vì vậy, hãy làm theo phần thay thế của lệnh. Lệnh & chỉ chèn mọi thứ được khớp với @"\([^.]*\)\.png", vào nội dung đã thay đổi. Nếu nó là phần tử duy nhất của bộ phận thay thế, sẽ không có gì thay đổi trong đầu ra. Tuy nhiên, theo sau & có một ký tự dòng mới - được biểu thị bằng dấu chéo ngược \ theo sau là dòng mới thực - và trong dòng mới, chúng tôi thêm chuỗi @" theo sau là nội dung của nhóm đầu tiên (\1) và sau đó là chuỗi ",.

Đây chỉ là giải thích ngắn gọn về lệnh. Hi vọng điêu nay co ich. Ngoài ra, lưu ý rằng bạn có thể sử dụng chuỗi \n để thể hiện dòng mới trong một số phiên bản sed (chẳng hạn như GNU sed). Nó sẽ làm cho một lệnh ngắn gọn hơn và dễ đọc:

sed 's/@"\([^.]*\)\.png",/&\[email protected]"\1",/' input 
+0

nổi bật. Bạn sẽ không xe để giải thích dòng lệnh fu của bạn sẽ? –

+0

Tôi chỉ đang cố gắng giải thích nó ngay cả trước khi đọc nhận xét của bạn :) Hy vọng nó làm cho giải pháp rõ ràng hơn. Nó sẽ là một niềm vui để trả lời bất kỳ câu hỏi còn lại về nó quá. – brandizzi

14

Bạn không cần phải có được khôn lanh với biểu thức thông thường và chuỗi thay thế: sử dụng của sed p lệnh để in các dòng còn nguyên vẹn, sau đó sửa đổi dòng và để cho nó in ngụ ý

sed 'p; s/\.png//' 
10

Phản hồi của trình cắm của Glenn là OK, nhưng nó cũng tăng gấp đôi các hàng không khớp với biểu thức.

một này, thay vào đó, tăng gấp đôi chỉ có các hàng mà khớp với cụm từ:

sed -n 'p; s/\.png//p' 

Ở đây, -n là viết tắt của "in gì trừ khi explicitely in", và p trong s/\.png//p buộc in nếu thay là thực hiện, nhưng không buộc nó khác

8

tôi thích này qua Carles Sala và Glenn Jackman:

sed '/.png/p;s/.png//' 

thể chỉ nói đó là p cá nhân tài liệu tham khảo.

0

hoặc người ta có thể kết hợp cả hai phiên bản và áp dụng các trùng lặp chỉ trên dây chuyền phù hợp với mô hình cần

sed -e '/^@".*\.png",/{p;s/\.png//;}' input 
Các vấn đề liên quan