2012-01-17 30 views
7

Có thể thay thế một thứ trong env var bằng SED không?Làm cách nào để sử dụng SED mà không có tệp có biến env?

$ a='aoeua' 
$ sed '[email protected]@[email protected]' <$a 
bash: aoeua: No such file or directory 
$ env|grep "SHELL" 
SHELL=/bin/bash 

Sản lượng tôi muốn là

ooeuo 

thay thế mỗi a trong 'aoeua' với o.

+0

Tôi đã chỉnh sửa câu hỏi của bạn để giải thích những gì đầu ra bạn đang tìm kiếm, dựa trên câu trả lời chấp nhận. Câu hỏi ban đầu cho chúng ta thấy những gì * không * làm việc, nhưng không rõ ràng cho chúng tôi biết bạn đang cố gắng làm gì. (Laurence đoán đúng.) –

Trả lời

10

Sử dụng tiếng vang:

$ echo "$a" | sed '[email protected]@[email protected]' 

Trong bash bạn cũng có thể làm thay đơn giản với cú pháp ${parameter/pattern/string}. Ví dụ:

$ v='aoeua' 
$ echo ${v/a/o} 
ooeua 

Lưu ý rằng điều này chỉ thay thế lần xuất hiện đầu tiên của mẫu.

+3

Đối với ** sự thay thế toàn cầu ** chúng ta có thể làm 'echo $ {v // a/o}'. –

+0

@JaypalSingh Cảm ơn! Tôi không thấy bất kỳ đề cập đến điều đó trong trang người đàn ông, nhưng có vẻ như nó hoạt động. –

+1

Yea, nó không được viết tốt. Đây là những gì nó nói - '$ {parameter/pattern/string} Mẫu được mở rộng để tạo ra một mẫu giống như trong việc mở rộng tên đường dẫn. Tham số được mở rộng và kết hợp mẫu dài nhất với giá trị của nó được thay thế bằng chuỗi. ** Nếu mẫu bắt đầu bằng /, tất cả các kết quả phù hợp của mẫu được thay thế bằng chuỗi **. Thông thường chỉ có trận đấu đầu tiên được thay thế.' –

6

Điều này có thể làm việc cho bạn:

a='aoeua' 
sed '[email protected]@[email protected]' <<<$a 
ooeuo 

<<<$a là một here-string

+0

Tôi cần phải thay thế mà không lặp lại (sử dụng trong biến PS1). điều này rất hữu ích cho tôi – astreal

+0

đang tìm kiếm điều này trong một thời gian ... rất đẹp – sloven

+0

+1, cú pháp tuyệt vời! Nhưng liên kết bị hỏng. – JMCF125

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