2011-01-05 38 views
16

Tôi tìm thấy câu hỏi này thực sự phù hợp với những gì tôi muốn: Parsing using awk or sed in Unix, tuy nhiên tôi không thể tìm ra những gì sau đây không: 1 trong sed làm gì?

's/\([,=]\) /\1/g' 

Tôi biết rằng g hiện một thay toàn cầu nhưng thực sự không thể hiểu được những gì đang xảy trong bối cảnh của câu hỏi.

Trả lời

27

Dưới đây là một ví dụ đơn giản:

$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/' 
ababcabc 
$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/g' 
ababab 
$ echo 'abcabcabc' | sed 's/\(ab\)\(c\)/\1d\2/g' 
abdcabdcabdc 

Trong lệnh đầu tiên, chỉ có trận đấu đầu tiên bị ảnh hưởng. Trong lệnh thứ hai, mọi trận đấu đều bị ảnh hưởng. Trong cả hai trường hợp, các \1 đề cập đến các ký tự bị bắt bởi dấu ngoặc đơn thoát.

Trong lệnh thứ ba, hai nhóm chụp được chỉ định. Chúng được gọi bằng cách sử dụng \1\2. Có thể sử dụng tối đa chín nhóm chụp.

Ngoài các nhà điều hành g (toàn cầu) (hoặc không có nó, các trận đấu đầu tiên), bạn có thể chỉ định một trận đấu cụ thể:

$ echo 'aaaaaa' | sed 's/a/A/4' 
aaaAaa 
+0

\\ 1 đang làm gì, nó có được mở rộng regex không? – Timo

+0

Dưới đây là ví dụ về \\ 1: 'sed -E -e" s/[^ /] {10} (\\. [^ \\.] +)? $/\\ 1/"' – Timo

+1

@Timo : '\ 1' chèn nội dung của nhóm chụp đầu tiên là kết quả khớp giữa tập hợp dấu ngoặc đơn đầu tiên. Tôi không biết liệu bạn có hỏi cụ thể về vụ việc với các dấu gạch chéo ngược tăng gấp đôi hay không, nhưng dường như nó hoạt động cho dù chúng có tăng gấp đôi hay không. Tôi sẽ không nói đó là một trường hợp của regex mở rộng bởi vì nó làm điều tương tự ngay cả khi bạn đang sử dụng regex cơ bản. –

10

\(...\) sẽ ghi lại các ký tự được chỉ định bên trong các parens và \1 sẽ được sử dụng để tham chiếu kết quả khớp đầu tiên, đây là một phần của regex.

+1

Tốt câu trả lời. Tôi chỉ muốn thêm rằng điều này có nghĩa là ví dụ cụ thể được trích dẫn loại bỏ một dấu cách sau dấu phẩy hoặc dấu bằng, bởi vì '\ 1' đặt lại bất kỳ thứ gì được khớp giữa các dấu ngoặc đơn, không bao gồm dấu cách. –

+0

Vì vậy, là/g cần thiết nếu bạn chỉ tham chiếu trận đấu đầu tiên? –

+0

còn gọi là "tham khảo ngược" – SiegeX