2009-07-24 36 views
11

Những gì tôi muốn làm là một cái gì đó như sau:Làm cách nào để bạn sử dụng biến tập lệnh shell làm đối số cho sed?

#!/bin/sh 
EMAIL="-e 's/SOMETHING//g'" 

somecommand | sed "$EMAIL" 

Nhưng tôi nhận được như sau:

sed: -e expression #1, char 2: unknown command: `'' 

Tôi đã thử nhiều biến thể. Tôi biết nó chỉ là vấn đề nhận được chuỗi trích dẫn đúng. Lý do tôi muốn làm điều này là để phá vỡ một lệnh sed dài lên cho dễ đọc. Tôi có nên sử dụng một tập lệnh sed (thay vì tùy chọn -f) không?

UPDATE:

kịch bản thực tế của tôi là một chút phức tạp hơn:

#!/bin/sh 
EMAIL="-e s/SOME THING//g -e s/SOME THING ELSE//g ..." 

somecommand | sed "$EMAIL" 

Sau khi loại bỏ các dấu ngoặc kép duy nhất tôi nhận được:

sed: -e expression #1, char 18: unknown option to `s' 

Trả lời

16

Đối với loại trích dẫn vấn đề, eval là hầu như luôn luôn dung dịch.

 
#!/bin/sh 
SED_ARG="-e 's/SOMETHING//g'" 

echo SOMETHING | eval sed "$SED_ARG" 

gì xảy ra là trong phiên bản của bạn, vỏ được gọi sed với một đối số (chuỗi "-e 's/SOMETHING // g'"), nhưng bạn muốn sed được gọi với hai đối số ("-e" và "'s/SOMETHING // g'"). Eval làm cho shell giải thích chuỗi theo cách bạn muốn.

0

Tháo dấu nháy đơn từ giá trị của EMAIL.

EMAIL="-e s/SOMETHING//g" 
0

loại bỏ các dấu nháy đơn và nó sẽ chỉ làm việc tốt

9

Passing arguments into a sed script chương trình với một ví dụ về cách viết grep.

#!/bin/sh 
#File: sedgrep 
sed -n 's/'"$1"'/&/p' 

grep có thể được thực hiện như,

sedgrep '[A-Z][A-Z]' <file 
0

này đã làm việc cho tôi (vòm với dấu ngoặc kép):

env | sed -n /"$USERNAME"/p 
+2

Đó là vì bạn đang làm điều gì đó hoàn toàn khác. – Swoogan

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