Lệnh sed hoạt động trên MacOS (ít nhất là OS 10) và Unix giống nhau (nghĩa là không yêu cầu gnu sed như Gilles '(hiện được chấp nhận).
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
Điều này hoạt động trong bash và có thể các shell khác cũng biết kiểu trích dẫn đánh giá $ '\ n'. Mọi thứ có thể nằm trên một dòng và hoạt động trong các lệnh sed / POSIX cũ hơn. Nếu có thể có nhiều dòng khớp với CLIENTSCRIPT = "foo" (hoặc tương đương của bạn) và bạn chỉ muốn thêm dòng bổ sung vào lần đầu tiên, bạn có thể làm lại như sau:
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(điều này tạo ra một vòng lặp sau mã chèn dòng chỉ quay vòng qua phần còn lại của tệp, không bao giờ quay lại lệnh sed đầu tiên nữa).
Bạn có thể nhận thấy tôi đã thêm '^ *' vào mẫu phù hợp trong trường hợp dòng đó hiển thị trong một nhận xét, nói hoặc được thụt lề. Nó không hoàn hảo 100% nhưng bao gồm một số tình huống khác có thể là phổ biến. Điều chỉnh theo yêu cầu ...
Hai giải pháp này cũng giải quyết được vấn đề (đối với giải pháp chung để thêm một dòng) rằng nếu dòng chèn mới của bạn chứa dấu gạch chéo ngược hoặc ký hiệu, chúng sẽ được giải thích bởi sed và có thể không xuất hiện giống nhau, giống như \n
là - vd.\0
sẽ là dòng đầu tiên phù hợp. Đặc biệt tiện dụng nếu bạn thêm một dòng xuất phát từ một biến trong đó trước tiên bạn phải thoát mọi thứ bằng cách sử dụng $ {var //} hoặc một câu lệnh sed khác, v.v.
Giải pháp này ít lộn xộn hơn trong các tập lệnh (mặc dù trích dẫn và \ n không dễ đọc), khi bạn không muốn đặt văn bản thay thế cho lệnh khi bắt đầu một dòng nếu nói, trong một hàm với các đường lõm. Tôi đã lợi dụng rằng $ '\ n' được đánh giá theo dòng mới bởi shell, nó không nằm trong các giá trị trích dẫn đơn '\ n' thông thường.
Nó đủ dài mặc dù tôi nghĩ rằng perl / thậm chí awk có thể thắng do dễ đọc hơn.