2012-09-03 58 views
6

Tôi đang cố gắng thực hiện chèn bằng sed (chỉ đọc lên trên) và tôi đang bị bối rối bằng cách cố chèn nhiều dòng?Sed Chèn nhiều dòng

gì tôi hiện đang làm là:

sed -i "${line} i\ 
     /* Name - ID */ \ 
     select @ID = NULL \ 
     from Animals \ 
     where VrsnID = @VrsnID \ 
     and  Request= \"Request\" \ 
\ 
" animalNames.txt 

Note echo $line == 131

New Vấn đề

Tất cả những gì xuất hiện trên cùng một dòng trong đầu ra? (Còn thiếu thụt lề đầu tiên)

/* Name - ID */  select @ID = NULL   from Animals   where VrsnID = @VrsnID   and  Request= "Request" 

Resolved

Nhưng điều này ném:

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

Bất cứ ý tưởng tại sao?

Cảm ơn thời gian của bạn

+0

Phiên bản nào của sed nào bạn sử dụng? GNU/BSD? – Zulu

+0

GNU xin lỗi đã không nhận ra rằng thực hiện một dif –

+0

Hoạt động ở đây, GNU sed phiên bản 4.2.1 – Thor

Trả lời

4

Đối với những rắc rối mới: Sử dụng đôi xuyệc ngược \\

+0

Tuyệt vời cảm ơn bạn, tại sao tôi không thể tìm thấy điều này ở bất cứ nơi nào trong google (phải có 20 + tìm kiếm cho "sed nhiều dòng chèn") –

+1

Bởi vì cho multiline nó tốt hơn để sử dụng AWK. (theo ý kiến ​​của tôi) – Zulu

+0

Trên một lưu ý phụ, có thể đọc một tập tin để chèn "nội dung" thay vì C & P vào lệnh sed? –

11

Trong một kịch bản shell, xuyệc ngược + xuống dòng mở rộng để không có gì. Đó là một cách để tiếp tục dòng tiếp theo mà không thực sự có một dòng mới trong chuỗi. Vì vậy, những gì sed thấy chỉ là một dòng lớn. So sánh:

$ echo "foo\ 
> bar" 
foobar 
$ echo "foo 
> bar" 
foo 
bar 

Bạn cần chuyển dấu gạch chéo ngược và dòng mới đến sed, vì vậy hãy thoát dấu gạch chéo ngược bằng cách đặt dấu gạch chéo ngược khác trước đó.

sed -i "${line} i\\ 
     /* Name - ID */ \\ 
     select @ID = NULL \\ 
     from Animals \\ 
     where VrsnID = @VrsnID \\ 
     and  Request= \"Request\" \\ 

" animalNames.txt 

Điều này có thể dễ đọc hơn nếu bạn chuyển đoạn mã trên đầu vào chuẩn như here document. Bạn cần phải mở rộng để thay thế ${line}, vì vậy bạn vẫn cần phải tăng gấp đôi dấu gạch chéo ngược.

sed -i -f - animalNames.txt <<EOF 
${line} i\\ 
     /* Name - ID */ \\ 
     select @ID = NULL \\ 
     from Animals \\ 
     where VrsnID = @VrsnID \\ 
     and  Request= "Request" \\ 

EOF 
+0

Cảm ơn tất cả các thông tin khác Gilles! –

+0

+1 cho phiên bản heredoc. Đã đấu tranh để có được một lệnh nội tuyến làm việc với nhiều dòng chứa nhiều ký tự meta và dấu ngoặc kép đáng kể. Phương pháp này làm việc hoàn hảo lần đầu tiên, và sạch hơn nhiều, vì vậy sẽ là goto của tôi trong tương lai. – randomsock

1

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

sed ${line}'i\ 
    /* Name - ID */ \ 
    select @ID = NULL \ 
    from Animals \ 
    where VrsnID = @VrsnID \ 
    and  Request= \"Request\" 

' animalNames.txt 
+0

Bạn cần sử dụng \\ cho một dòng mới –

+0

@PezCuckow cho tôi (sử dụng GNU sed và bash) một đơn \ là đủ. – potong

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