Làm cách nào để chèn một dòng ở đầu tệp văn bản bằng dòng lệnh?


25

Tôi muốn chèn văn bản ở đầu tệp đã có. Làm thế nào tôi có thể đạt được điều này. Tôi đã thử echoteekhông thành công.

Tôi đã cố gắng chèn dòng repo ở đầu sources.listtập tin từ thiết bị đầu cuối.

chú thích

Tôi cần một giải pháp nhanh một dòng, vì tôi đã biết phương pháp trả lời khác


1
tee thêm một dòng ở dưới cùng của tệp, ví dụ: echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.listbạn cũng cần sudo trước tee để có được quyền quản trị viên. Nhưng tại sao bạn lại muốn thêm một cái gì đó vào đầu nguồn.list?
Savvas Radevic

2
@medigeek: nơi nào đó trong lịch sử câu hỏi của OP bạn sẽ tìm thấy một cái gì đó về cài đặt / cập nhật từ một đĩa CD-repo ... Tôi nghi ngờ rằng có thể là lý do ...
ish

Cảm ơn @izx, giả định của bạn là chính xác. Tôi lặng lẽ ấn tượng. Bạn cũng có thể trả lời câu hỏi đó Đó là về việc cài đặt từ một repo cục bộ bằng cách sử dụng trung tâm phần mềm và cũng đặt repo cục bộ của tôi ở mức ưu tiên cao nhất mà không đặt nó lên hàng đầu. Cảm ơn một lần nữa.
Anwar

1
@izx, Đây là liên kết về việc đặt mức độ ưu tiên cao nhất cho kho lưu trữ cục bộ của tôi. Tôi sẽ rất vui nếu bạn cũng có thể kiểm tra câu hỏi này về trung tâm phần mềm . Cảm ơn một lần nữa cho bình luận đầu tiên của bạn. rất vui mừng
Anwar

1
@medigeek, bạn có thể xem câu hỏi này để giải thích cho một câu hỏi không phổ biến như vậy.
Anwar

Câu trả lời:


38

Nó thực sự khá dễ dàng với sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1inói với sed để chèn văn bản theo sau dòng 1 của tệp; đừng quên \dòng mới ở cuối để dòng 1 hiện có được chuyển sang dòng 2.


1
Cảm ơn. Chỉ cần lưu ý: nếu bạn muốn thay thế, thay vì chèn sử dụng sthay vì tôi vào 1i.
Anwar

3
Đáng buồn là điều này không thành công cho tập tin trống (nó không có dòng nắm tay, vì vậy sed không bao giờ chèn).
Tino

@Tino Đối với các tệp trống bạn chỉ có thể sử dụngecho "Text Here" >> Filename
Flotolk

không hoạt động trên MacOS 10
Krishna

7

Trong chỉnh sửa chung tại chỗ với một kịch bản là khó khăn, nhưng bạn có thể sử dụng echocatvà sau đómv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

Tuy nhiên, nếu bạn đang chơi với nguồn.list, bạn cần thêm một số xác thực và chống đạn để phát hiện lỗi, v.v. vì bạn thực sự không muốn mất điều này. Nhưng đó là một câu hỏi riêng biệt :-)


Tôi có thể làm điều đó rồi. Tôi cần một giải pháp một dòng như izx đã đưa ra. tuy nhiên cảm ơn câu trả lời của bạn
Anwar

1
@AnwarShah - ah xin lỗi! Bạn nên nói rằng trong câu hỏi của bạn :-)
Sean

Tôi thừa nhận, +1 cho câu trả lời của bạn và cũng cho nhận xét. (Tôi không thể cung cấp thêm)
Anwar

6
./prepend.sh "myString" ./myfile.txt

được biết đó prependvỏ tùy chỉnh của tôi :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Cũng sử dụng một đường dẫn tương đối hoặc đường dẫn tuyệt đối, nó sẽ hoạt động tốt:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Cập nhật:

nếu bạn muốn một tập lệnh vĩnh viễn cho việc này, hãy mở nano /etc/bash.bashrcrồi thêm chức năng này vào cuối tập tin:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Mở lại thiết bị đầu cuối của bạn và tận hưởng:

prepend "another line at top" /path/to/my/file.txt

5

Và tại sao không sử dụng một trình soạn thảo văn bản chính hãng cho điều đó? ed là trình soạn thảo văn bản tiêu chuẩn.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

Hoặc, nếu bạn muốn các lệnh dễ đọc hơn:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: đi đến tuyến đầu
  • i: chế độ chèn
  • công cụ của bạn mà bạn muốn chèn ...
  • .: dừng chèn, trở lại chế độ bình thường
  • wq: viết và bỏ, cảm ơn, tạm biệt.

Làm thế nào để sử dụng thay thế biến shell (trong FIRST LINE) với điều này?
vp_arth

1
@vp_arth Nếu nội dung của bạn có biến first_linethì : ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Đảm bảo rằng biến không mở rộng thành một dấu chấm duy nhất và không chứa bất kỳ ký tự dòng mới nào (vì vậy hãy vệ sinh nó nếu nó đến từ đầu vào của người dùng).
gniourf_gniourf 2/215

3

Luôn luôn có awktùy chọn. Thay thế stringbiến với nội dung của bạn. Đây không phải là một sự thay đổi tại chỗ mặc dù. Cá nhân, tôi có xu hướng không thực hiện thay đổi tại chỗ. Đây chắc chắn là một sở thích cá nhân. Hai điều, -vbiểu thị một biến trong awk và biến nđược sử dụng ở đây để khớp với số dòng, một cách hiệu quả NR == 1. Bạn có thể sử dụng điều này theo bất kỳ cách nào chỉ bằng cách thay đổi giá trị của ns.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Thí dụ:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line

2

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

ex -sc '1i|hello world' -cx sources.list
  1. 1 chọn dòng 1

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

  3. x lưu và đóng


Đơn giản hơn nhiều so với các giải pháp khác được cung cấp cho đến nay. Cảm ơn bạn.
Pothi Kalimuthu
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.