2011-10-06 28 views
34

Đang cố gắng để thay đổi giá trị trong một tập tin văn bản bằng cách sử dụng sed trong một kịch bản bash với dòng,thay sed với các biến bash

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp 

Đây sẽ là trong một vòng lặp for. Không chắc tại sao nó không hoạt động. Bất kỳ đề xuất?

Trả lời

47

Các biến bên trong ' không được thay thế bằng bash. Để có được thay thế chuỗi (hay suy, nếu bạn đã quen thuộc với perl), bạn sẽ cần phải thay đổi nó để sử dụng dấu ngoặc kép " thay vì dấu nháy đơn:

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp 

Ngoài ra, trừ khi bạn cần nó trong một tập tin khác nhau bạn có thể sử dụng cờ -i để thay đổi tệp tại chỗ.

+4

Cũng có thể đề cập rằng nếu biến chứa dấu gạch chéo, bạn cần phải sử dụng dấu tách khác không xuất hiện trong chuỗi (hoặc dấu gạch chéo ngược-thoát mỗi lần xuất hiện của dấu phân tách). Dấu gạch chéo là một mặc định chung cho 's' nhưng bạn có thể sử dụng bất kỳ ký tự dấu chấm câu nào; 'sed 's% draw ($ prev_number; n _)% vẽ ($ number; n _)% g" file.txt' hoặc 's # từ # đến # g' hoặc' s_from_to_g', v.v. – tripleee

5
sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

có hoạt động không?

13

biến trong các dấu nháy đơn không được mở rộng, trong dấu ngoặc kép, chúng sử dụng dấu ngoặc kép trong trường hợp này.

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp 

Bạn cũng có thể làm cho nó hoạt động với eval, nhưng đừng làm điều đó !!

+0

Cảm ơn bạn đã làm việc. Bạn có thể giải thích ý nghĩa của bạn bằng cách mở rộng không? Trực giác của tôi nói với tôi rằng nó nên là một cái gì đó như thế, biến thay thế. Ngoài ra tại sao không sử dụng eval? – csta

1

Bạn có thể sử dụng các biến như dưới đây. Như ở đây, tôi muốn thay thế hostname tức là, biến hệ thống trong tệp. Tôi đang tìm kiếm chuỗi look.me và thay thế mà toàn phù hợp với look.me=<system_name>

sed -i "s/.*look.me.*/look.me=`hostname`/" 

Bạn cũng có thể lưu trữ giá trị hệ thống của bạn trong biến khác và có thể sử dụng biến mà sử dụng quyền thay.

host_var= 'hostname`

sed -i "s/.*look.me.*/look.me=$host_var/"


Input file:

look.me=demonic 

Output file (giả sử tên hệ thống của tôi là prod-cfm-frontend-1-usa-central-1):

look.me=prod-cfm-frontend-1-usa-central-1 
Các vấn đề liên quan