2013-06-29 7 views
8

Tôi đang tuyệt vọng cố gắng thay thế một dấu gạch chéo (/) với dấu chéo ngược đôi kèm theo trong dấu ngoặc kép ("\\")Thay thế dấu gạch chéo lên với dấu chéo ngược đôi kèm theo trong dấu ngoặc kép

nhưng

a=`echo "$var" | sed 's/^\///' | sed 's/\//\"\\\\\"/g'` 

không làm việc, và tôi không biết tại sao. Nó luôn thay thế chỉ bằng một dấu gạch chéo ngược chứ không phải hai dấu gạch chéo ngược và không phải là hai số

Trả lời

20

Khi / là một phần của một biểu thức chính quy mà bạn muốn thay thế với s (thay thế) lệnh của sed, bạn có thể sử dụng một nhân vật khác thay vì gạch chéo theo cú pháp của lệnh, do đó bạn viết, ví dụ:

sed 's,/,\\\\,g' 

trên , được sử dụng thay cho usu al dấu gạch chéo để phân định hai tham số của lệnh s: biểu thức chính quy mô tả một phần được thay thế và chuỗi được sử dụng làm phần thay thế.

Ở trên sẽ thay thế mọi dấu gạch chéo bằng hai dấu gạch chéo ngược. Dấu chéo ngược là một ký tự đặc biệt (trích dẫn), vì vậy nó phải được trích dẫn, ở đây nó được trích dẫn với chính nó, đó là lý do tại sao chúng ta cần 4 dấu gạch chéo ngược để biểu diễn hai dấu gạch chéo ngược.

$ echo /etc/passwd| sed 's,/,\\\\,g' 
\\etc\\passwd 
14

Làm thế nào về điều này?

a=${var//\//\\\\} 

Demo trong một vỏ:

$ var=a/b/c 
$ a=${var//\//\\\\} 
$ echo "$a" 
a\\b\\c 
+1

Nice. Tôi đã không nhận ra cho đến khi tôi thấy rằng điều này thêm một dấu gạch chéo về phía trước thứ hai ở đầu của sự thay thế làm cho nó toàn cầu. Rất hữu dụng! –

+0

busybox tro (BusyBox v1.21.1, v1.22.1) có một rắc rối với '/' thay $ a = abc/abc/abc $ echo $ {a // c/_} ab_/ab_/ab_ $ echo $ {a // \ // _} abc/abc/abc – yurenchen

0

Một cách khác để làm việc đó: tr '/' '\'

$ var=a/b/c 
$ echo "$var" 
a/b/c 
$ tr '/' '\' <<< "$var" 
a\b\c