Đ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ì 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
nổi bật. Bạn sẽ không xe để giải thích dòng lệnh fu của bạn sẽ? –
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