Bạn có một vài vấn đề:
- Bạn đang sử dụng
\b
sai
- Bạn đang thay thế mã với các biến shell
- Bạn cần phải trích dẫn metacharacters
Từ perldoc perlre
Một ranh giới từ ("\ b") là một điểm giữa hai nhân vật mà có một "\ w" ở một bên của nó
Cả trong những nhân vật @
hoặc &
là \w
ký tự. Vì vậy, trận đấu của bạn được đảm bảo không thành công. Bạn có thể muốn sử dụng cái gì đó như s/(^|\s)\@d\&(\s|$)/${1}new text$2/
(^|\s)
nói để phù hợp với một trong hai đầu của chuỗi (^
) hoặc ký tự khoảng trắng (\s
).
(\s|$)
nói để khớp với phần cuối của chuỗi ($
) hoặc ký tự khoảng trắng (\s
).
Để giải quyết vấn đề thứ hai, bạn nên sử dụng %ENV
.
Để giải quyết vấn đề thứ ba, bạn nên sử dụng các chuỗi thoát \Q
and \E
để thoát khỏi giá trị trong $ENV{a}
.
Đưa nó tất cả cùng nhau chúng ta nhận được:
#!/bin/bash
export a='@d&'
export b='new text'
echo 'param5 @d&' |
perl -pe 'next if /^#/; s/(^|\s)\Q$ENV{a}\E(\s|$)/$1$ENV{b}$2/ if /param5/'
nào in
param5 new text
Nguồn
2010-05-27 19:10:51
http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters- in-a-perl-regex – daxim