2013-02-13 42 views
14

Tôi cố gắng để chạy lệnh này trên MacOSX thiết bị đầu cuối, mà ban đầu được dự định để chạy trên Linuxlỗi lệnh SED trên hệ điều hành MacOS X

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' init.txt >> ~/.bash_profile 

nhưng nó mang lại cho tôi những lỗi:

command i expects \ followed by text. 

là có cách nào tôi có thể sửa đổi lệnh trên để làm việc trên thiết bị đầu cuối MacOSX

Trả lời

1

Có vẻ như bạn đã sao chép văn bản đa dạng thức. Các dấu nháy đơn nên thẳng không xoăn:

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' 
+0

Điểm tốt về các trích dẫn, nhưng điều đó một mình không giải quyết được vấn đề cụ thể của OSX. – mklement0

5

Các OSX sed s được dựa trên các phiên bản cũ hơn, bạn cần phải được nhiều hơn nữa chữ trong hướng dẫn của bạn để sed, VÀ bạn may mắn, trong trường hợp này, sed đang nói cho bạn biết chính xác phải làm gì. Chưa được kiểm tra vì tôi không có OSX, nhưng hãy thử

sed '1 i\ 
VISPATH=/mnt/local/gdrive/public/3DVis 

' init.txt >> ~/.bash_profile 

Nhập thông qua i cmd được chấm dứt bằng một dòng trống. Các hướng dẫn sed khác có thể theo sau đó. Lưu ý, KHÔNG có ký tự sau \ char!

Ngoài ra, @StephenNiedzielski là đúng. Sử dụng các ký tự trích dẫn đơn để bọc các câu lệnh sed của bạn. (Nếu bạn cần biến mở rộng bên trong sed và có thể thoát khỏi ứng dụng khác lại $, sau đó bạn cũng có thể sử dụng dbl dấu ngoặc kép, nhưng nó không được khuyến khích như một thông lệ bình thường.

chỉnh sửa

Theo tôi được biết hiện nay bạn đang làm điều này từ dòng lệnh, chứ không phải trong kịch bản hay trình soạn thảo khác, tôi đã thử nghiệm ở trên, và .... tất cả những gì tôi có thể nói là dòng nổi tiếng từ hỗ trợ kỹ thuật ... "Nó hoạt động cho "Nếu bạn nhận được thông báo lỗi

sed: -e expression #1, char 8: extra characters after command 

thì bạn gần như chắc chắn đã thêm một số ký tự sau \. Tôi vừa thử nghiệm điều đó và tôi nhận được thông báo lỗi ở trên. (Tôi đang sử dụng một phiên bản Linux của sed, vì vậy các thông báo lỗi là chính xác như nhau). Bạn nên chỉnh sửa câu hỏi của mình để bao gồm việc cắt chính xác dòng lệnh của bạn và thông báo lỗi mới mới. Sử dụng dấu nháy đơn sẽ không hoạt động.

IHTH

+1

Đã thử nghiệm trên Mac OS X; nó hoạt động, mặc dù dòng trống chỉ đơn giản là một lệnh trống (để nhúng dòng mới trong văn bản, bạn phải kết thúc dòng bằng dấu gạch chéo ngược). –

+0

Tôi thử điều đó và tôi nhận được thông báo sau: ký tự thừa sau \ ở cuối lệnh i – user2067030

+0

nếu bạn đang sử dụng trình soạn thảo 'vi' hoặc' vim', hãy bật danh sách cmd, tức là ': set list', và tôi đặt cược bạn thấy các ký tự khoảng trắng sau chữ '' 'char của bạn. Bạn không thể sử dụng trình xử lý văn bản để viết kịch bản 'sed'; -) !!! chúc may mắn. – shellter

4

Đây là cách tôi làm việc nó ra trên OS X. Trong trường hợp của tôi, tôi cần phải bổ sung văn bản vào một tập tin. Rõ ràng, các công trình sed hiện đại như thế này:

sed -i '1i text to prepend' file.txt 

Nhưng trên OS X tôi phải làm như sau:

sed -i '' '1i\ 
text to prepend 
' file.txt 
29

Shelter là đúng nhưng có một cách khác để làm điều đó. Bạn có thể sử dụng dấu ngoặc kép $'...' để diễn giải lối thoát trước khi chuyển chuỗi đến sed.

Vì vậy:

  sed -iold '1i\'$'\n''text to prepend'$'\n' file.txt 
         ^^^^^^^^     ^
        /|\|||/ \     |__ No need to reopen 
        | | \|/ |       string to sed 
    Tells sed to | | | | 
    escape the next _/ | | +-----------------------------+ 
     char   | +-------------+     | 
         |    |     | 
        Close string The special bash Reopen string to 
        to sed  newline char to  send to sed 
            send to sed 

This answer trên unix.stackexchange.com dẫn tôi đến giải pháp này.

+9

+1 cho hình minh họa rất đẹp! – shellter

+0

Đây là giải pháp duy nhất đã hoạt động đối với tôi trên OS X trong tập lệnh bash khi sử dụng biến. Không thanh lịch nhưng nó hoạt động và nên di động. Ví dụ. sed -i.tmp '2i \' $ '\ n' "$ LINE" $ '\ n' $ FILE – djule5

+0

Phần lớn <3 cho nỗ lực giải thích –

10

Đã cùng một vấn đề và giải quyết nó với brew:

brew install gnu-sed

gsed YOUR_USUAL_SED_COMMAND

Nếu bạn muốn sử dụng lệnh sed, sau đó bạn có thể thiết lập một bí danh:

alias sed=gsed

+2

đã thực hiện thủ thuật, cảm ơn bạn – jarandaf

+2

Ngoài ra, bạn có thể cài đặt 'gnu-sed 'với tùy chọn' --with-default-names' ở cuối, do đó gnu-sed được cài đặt sẽ có tên 'sed'. –

+1

Oh cảm ơn bạn cảm ơn bạn! – abalter

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