Lệnh sed quay trở lại sed sed: tùy chọn xấu trong biểu thức thay thế


0

Ví dụ: - Tôi có một tệp có tên file.txt

$ cat file.txt
$key

Tôi có một biến môi trường, ví dụ: $ key trong tệp văn bản

và giả sử $ key = 1234, vì vậy tôi có thể thay thế giá trị bằng lệnh bên dưới

sed -i 's/$key/'"$key"'/' file.txt 

và nó trở thành

$ cat file.txt
1234

Vấn đề của tôi là nếu giá trị cho

$key = 1/2/3/4

Tôi không thể chạy lệnh dưới đây

sed -i 's/$key/'"$key"'/' file.txt  

Nó sẽ báo lỗi

sed: bad option in substitution expression

Bởi vì dấu gạch chéo nó bị phá vỡ. Tôi có thể giải quyết nó bằng cách đưa ra giá trị trực tiếp nhưng tôi không muốn sử dụng nó theo cách đó.

sed -i 's/$key/1\/2\/3\/4/' file.txt 

Câu trả lời:


5

Vấn đề phải làm với thực tế là seddấu phân cách /và nó va chạm với văn bản trong $key. Để giải quyết nó, sử dụng một dấu phân cách khác. Ví dụ #:

$ key="1/2/3/4"
$ echo 1/2/3/4 | sed "s#$key#\"$key\"#" 
"1/2/3/4"

Hoặc là

$ echo "hello this is 1/2/3/4 yeah" | sed "s#$key#\"$key\"#"
hello this is "1/2/3/4" yeah

Đọc thú vị: Bạn có thể sử dụng dấu phân cách nào trong sed? . Spoiler: gần như tất cả mọi thứ!


Vấn đề là khi bạn không biết biến nào sẽ chứa biến.
choroba

1

Perl để giải cứu:

perl -pe 's/\$([[:alnum:]]+)/$ENV{$1}/'

Giải trình:

  • \$ phù hợp với ký hiệu đô la.
  • [[:alnum:]]khớp các chữ số, chữ cái và dấu gạch dưới, tức là các ký tự định danh hợp lệ. Có +nghĩa là phải có ít nhất một nhân vật như vậy.
  • (...) giới thiệu một nhóm chụp.
  • $ENV{$1}lấy giá trị từ %ENVhàm băm chứa các biến môi trường. Perl không mở rộng các biến như shell, vì vậy biến có thể chứa /(hoặc bất cứ thứ gì khác) mà không gây hại.

Thí dụ:

$ echo '$key' | key=1/2/3/4 perl -pe 's/\$([[:alnum:]]*)/$ENV{$1}/'
1/2/3/4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.