2010-01-16 29 views
10

Tôi có một mẫu regex và thay thế đã được kiểm tra trong Notepad ++ trên dữ liệu đầu vào của tôi và hoạt động chính xác. Tuy nhiên, khi tôi đặt chúng vào một biểu thức sed, không có gì phù hợp.Thoát các chuỗi sed đúng

Đây là lệnh sed:

# SEARCH = ([a-zA-Z0-9.]+) [0-9] (.*) 
# REPLACE = \2 (\1) 

sed -e 's/\([a-zA-Z0-9.]+\) [0-9] \(.*\)/\2 \(\1\)/g' 

Đây là một mẫu của dữ liệu:

jdoe 1 Doe, John 
jad 1 Doe, Jane 
smith 2 Smith, Jon 

và đầu ra mong muốn:

Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 

Tôi đã cố gắng loại bỏ và thêm trốn thoát đến các nhân vật khác nhau trong biểu thức sed, nhưng hoặc là không có gì phù hợp hoặc một cái gì đó dọc theo dòng:

sed: -e expression #1, char 42: invalid reference \2 on `s' command's RHS 

Làm cách nào để thoát khỏi chính xác?

Trả lời

17

Tôi thường tìm thấy nó dễ dàng hơn để sử dụng công tắc -r vì điều này có nghĩa là thoát là tương tự như của hầu hết các ngôn ngữ khác:

dấu
sed -r 's/([a-zA-Z0-9.]+) [0-9] (.*)/\2 (\1)/g' file1.txt 
+0

Đó làm việc thật đẹp. Cảm ơn. –

4

Các cộng cần phải được thoát khi không sử dụng -r switch.

9

Một vài cảnh báo và bổ sung vào những gì người khác đã nói:

  1. Tùy chọn -r là một phần mở rộng GNU để cho phép biểu thức thông thường kéo dài. BSD có nguồn gốc của sed sử dụng -E để thay thế.
  2. SedGrep sử dụng Basic Regular Expressions
  3. Awk sử dụng Extended Regular Expressions
  4. Bạn nên trở nên thoải mái với POSIX specifications như IEEE Std 1003.1 nếu bạn muốn viết kịch bản portable, makefiles vv

Tôi muốn giới thiệu viết lại biểu hiện dưới dạng

's/\([a-zA-Z0-9.]\{1,\}\) [0-9] \(.*\)/\2 (\1)/g' 

nên thực hiện chính xác những gì bạn muốn trong bất kỳ POS23 nào tuân thủ sed. Nếu bạn thực sự quan tâm đến những điều như vậy, hãy xem xét xác định biến môi trường POSIXLY_CORRECT.

1
$ sed -e 's/\([a-zA-Z0-9.].*\) [0-9] \(.*\)/\2 \(\1\)/g' file 
Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 
2

Sử dụng awk là đơn giản hơn nhiều ...:

cat test.txt | awk '{ print $3 " " $4 " " "("$1")" }' 

Output:

Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 

Xem người awk 1

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