Làm thế nào để chèn văn bản sau một chuỗi nhất định trong một tập tin?


69

Ngay bây giờ tôi đang sử dụng echo "Hello World" >> file.txtđể nối một số văn bản vào một tệp nhưng tôi cũng cần thêm văn bản bên dưới một chuỗi nhất định, hãy nói "[tùy chọn]", điều đó có khả thi sedkhông?

VÍ DỤ:

Tập tin đầu vào

Some text
Random
[option]
Some stuff

Tập tin đầu ra

Some text
Random
[option]
*inserted text*
Some stuff

1
Bạn phải cụ thể hơn và đưa ra một số văn bản mẫu cho mọi người để giúp bạn với các lệnh chính xác.
clement

vui lòng chỉnh sửa Q và hiển thị inputcác outputdòng. Vì bạn Q không rõ ràng. Bạn cũng có thể làm echo "Hello World [option]" >> file.txt, nhưng nó không có ý nghĩa.

Tôi đã chỉnh sửa câu hỏi để cung cấp thêm thông tin để tham khảo nhưng câu trả lời được chấp nhận là những gì tôi đang cố gắng thực hiện
Javier Villanueva

Nếu bạn chỉ muốn chỉnh sửa một tập tin cấu hình thì đây là giải pháp tốt nhất tôi tìm thấy: unix.stackexchange.com/a/78076/20661
rubo77 21/07/2016

Câu trả lời:


104

Nối dòng sau trận đấu

  • sed '/\[option\]/a Hello World' input

Chèn dòng trước khi khớp

  • sed '/\[option\]/i Hello World' input

Ngoài ra, bạn có thể sao lưu và chỉnh sửa tệp đầu vào tại chỗ bằng cách sử dụng -i.bkptùy chọn để sed


2
trên osx tôi nhận đượcsed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole


đối với Mac OSX, tôi cần thêm \ <<NEWLINE>>sau atùy chọn
Tom Howard

Đoạn mã trên sẽ nối / chèn dòng cho mỗi trận đấu. Nếu bạn chỉ muốn thêm / chèn dòng cho trận đấu đầu tiên, bạn có thể thêm vào 0,các lệnh: sed '0,/\[option\]/a Hello World' inputhoặcsed '0,/\[option\]/i Hello World' input
kimbaudi

33

Có, có thể với sed:

sed '/pattern/a some text here' filename

Một ví dụ:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$

2
@javiervd Tôi không chắc ý của bạn về câu trả lời đầu tiên là gì? Nếu bạn có ý đầu tiên trước thời gian trả lời, thì bạn đã sai. Bạn đã không quan sát dấu thời gian một cách cẩn thận!
tà tà

Có cách nào để thêm nó sau khi chuỗi mới nhất khớp không? Ví dụ : foo bar option bar option baz . Vậy mô hình trở thành foo bar option bar option addedstring baz ?
Ari

4

Với awk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

Hãy nhớ rằng một số ký tự không thể được bao gồm theo nghĩa đen vì vậy người ta phải sử dụng các chuỗi thoát (chúng bắt đầu bằng dấu gạch chéo ngược), ví dụ để in dấu gạch chéo ngược theo nghĩa đen mà người ta phải viết \\.

Nó thực sự giống với sednhưng ngoài ra, mỗi dòng mới được nhúng trong văn bản phải được bắt đầu bằng dấu gạch chéo ngược:

sed '/PATTERN/a\
add one line\
\\and one more' infile

Để biết thêm chi tiết về trình tự thoát tham khảo hướng dẫn.


Một dòng awk không thực sự thay đổi văn bản, chỉ xuất ra.
Josef Klimuk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.