Chèn văn bản vào số dòng cụ thể


12

Tôi đang làm việc với một tập lệnh bash sẽ phân chia nội dung của tài liệu văn bản tùy thuộc vào dữ liệu trong dòng.

Nếu nội dung của tệp gốc nằm dọc theo dòng

01 line
01 line
02 line
02 line

Làm cách nào tôi có thể chèn vào dòng 3 của tệp này bằng cách sử dụng bash để dẫn đến

01 line
01 line
text to insert
02 line
02 line

Tôi hy vọng sẽ làm điều này bằng cách sử dụng một di sản hoặc một cái gì đó tương tự trong kịch bản của tôi

#!/bin/bash

vim -e -s ./file.txt <<- HEREDOC
    :3 | startinsert | "text to insert\n"
    :update
    :quit
HEREDOC

Tất nhiên, những điều trên không hoạt động nhưng có khuyến nghị nào tôi có thể thực hiện trong tập lệnh bash này không?


Câu trả lời:


14

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 chọn dòng 3

  2. i chèn văn bản và dòng mới

  3. x viết nếu thay đổi đã được thực hiện (họ có) và thoát

Hoặc bằng cách kết hợp chuỗi:

ex -s -c '/hello/i|world' -c x file.txt

8

sed sẽ là một lựa chọn truyền thống (GNU sed có thể có một hình thức dễ dàng hơn thế này).

$ cat input
01 line
01 line
02 line
02 line
$ sed '2a\
text to insert
' < input
01 line
01 line
text to insert
02 line
02 line
$ 

Hoặc, cực kỳ truyền thống, ed(tiền thưởng! Chỉnh sửa tại chỗ mà không có sed -ihình thức không thể truy cập được).

$ (echo 2; echo a; echo text to insert; echo .; echo wq) | ed input
32
01 line
47
$ cat input
01 line
01 line
text to insert
02 line
02 line
$ 

(Điều này không có gì để làm với bash.)


2
thêm bonux thay thế echo text to insertbởicat file-to-insert.txt
Archemar 22/03/2016

1
Ít nhất là với bash, thay vì tất cả những thứ đó echo, bạn có thể sử dụngprintf '%s\n' 2 a 'text to insert' . wq
evilsoup 22/03/2016

6

Làm thế nào về một cái gì đó như:

head -n 2 ./file.txt > newfile.txt
echo "text to insert" >> newfile.txt
tail -n +3 ./file.txt >> newfile.txt
mv newfile.txt file.txt

1
Ý tưởng kỳ lạ nhưng thú vị +1
Tyþë-

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
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.