Làm thế nào tôi có thể ghi vào dòng thứ hai của một tập tin từ dòng lệnh?


29

Tôi có một chương trình bên ngoài tạo ra một tệp đầu ra (có thể có dòng 20K).

Tôi cần chèn một dòng mới giữa dòng 1 và dòng 2. Tôi đã xem xét awk và sed - Tôi sử dụng một lớp lót trong mỗi dòng khá đều đặn - nhưng tôi không thể đưa ra các công tắc phù hợp để làm cái này.

Câu trả lời:


20
awk 'NR==1{print; print "new line"} NR!=1'

12
awk 'NR==2 {print "new line"} 1'
Ngắn

@glennjackman: phiên bản của bạn không hoạt động trên hệ thống của tôi, nhưng câu trả lời là có. Cụ thể, với dòng của bạn, dòng 2 được nhân đôi và dòng mới được chèn vào giữa cả hai (như dòng 3).
Nikana Reklawyks

Có cách nào để bắt đầu viết ở dòng thứ 2 và ghi đè lên tất cả các dòng tiếp theo không?
CMCDragonkai

@CMCDragonkai Tôi không chắc chắn những gì bạn yêu cầu. Chỉ cần in dòng đầu tiên của tập tin được chỉ định và một dòng thứ hai được thiết lập? Dòng đầu tiên và sau đó là nội dung của một tập tin? Dòng đầu tiên của tệp đầu tiên và sau đó là một dòng từ tệp thứ hai cho mỗi dòng còn lại trong dòng đầu tiên? Bạn có thể muốn hỏi một câu hỏi mới với một mô tả rất cụ thể về những gì bạn muốn, và một ví dụ tương đối ngắn nhưng đầy đủ.
Kevin

16

Đối với trường hợp cụ thể của bạn, điều này sẽ đơn giản hơn:

sed '1 { P ; x }' your-file

Giải thích: ở dòng 1 , làm như sau

  1. P rint dòng
  2. E x thay đổi không gian mẫu với không gian giữ (về cơ bản làm trống bộ đệm)

Sau đó, dòng (trống bây giờ) được in lại như là một phần của chu trình.


Nếu bạn muốn thêm một dòng mới thay vì một ký tự dòng mới (những gì tôi hiểu ban đầu) thì chỉ cần sử dụng sedlệnh của a\(append):

sed '1 a\
appended line' your-file

hoặc thậm chí

sed '1 aappended line' your-file

Nó nối thêm " appended line" sau dòng 1.


1
sed -i '1 a\\' filechỉ cho một dòng mới.
Forcefsck

1
@forcefsck Vâng, chỉ có nhược điểm là đó là GNUism, là '1 aapended line'ví dụ thứ hai của tôi .
angus

8

Tôi đoán sedcách tiếp cận sẽ là:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Điều này sẽ đưa văn bản vào dòng thứ hai của tệp và sau đó dòng thứ hai thực sự có trong tệp sẽ trở thành dòng thứ ba.

Lưu ý rằng, sử dụng chế độ chắp thêm , nếu phải, nó phải sử dụng dòng đầu tiên, vì việc nối thêm sẽ xảy ra sau khi ghi chú số dòng.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt



2

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

sed 1G file

Nếu bạn muốn chèn somethingsau dòng mới:

sed '1{G;s/$/something/}' file

Hoặc nếu bạn xử lý sed \n:

sed '1s/$/\nsomething/' file

Tất nhiên alà dễ dàng hơn nữa:

sed '1a something' file

Tôi xin lỗi, nó làm gì?
Nikhil Mulley

Nó chèn một dòng mới sau dòng 1
potong

1
Hay đúng hơn là nối một dòng mới \nvào dòng một!
potong

1

Tôi thường sử dụng edcho việc này:

(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename

Tương tự như một sedgiải pháp, nhưng không có sự lộn xộn của các dòng mới thoát.


2
Bạn có thể tha cho một số echo, đặc biệt là dưới bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
thao tác

1
Không hoạt động trong tất cả các hệ vỏ, ví dụ như trong dashnhiều hệ thống /bin/sh.
Arcege

1
Đó là lý do tại sao tôi đã viết ra Bạn có thể tha thứ cho một số người echo . Sparing tất cả echo 's thực sự là bashchỉ tính năng, nhưng giảm echosố 4-1 công trình trong dashkshquá: echo '1a\nLine to insert\n.\nw' | ed - filename.
manatwork

1
Hoặc chỉ sử dụngprintf %s\\n , đặt một dòng mới sau mỗi đối số bạn đưa ra và không làm hỏng các ký tự đặc biệt được nhúng trong dòng bạn muốn chèn. Ngoài ra, tại sao sử dụng edkhi excó sẵn?
tự đại diện

1

Giải pháp Python

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt

0

Sử dụng sedvà (đặc thù Bash) mã thoát ANSI:

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'

0

tôi sẽ sử dụng python cho việc này

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`

0

Tôi chỉ thích sử dụng một bộ đếm rõ ràng:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file

0

Phương pháp đơn giản nhất sử dụng printfex:

printf '%s\n' 1a 'my line to insert' . x | ex file

1acó nghĩa là "nối sau dòng đầu tiên"; sự .kết thúc của việc nối thêm; xcó nghĩa là lưu và thoát.


0

Không có câu trả lời nào ở trên đề cập đến cách lưu các thay đổi vào tệp gốc, đó là điều tôi nghĩ OP đã yêu cầu.

Đó chắc chắn là những gì tôi cần khi tôi vào trang.

Vì vậy, giả sử tập tin của bạn được gọi output.txt

sed -i '1 a This is the second line' output.txt

Trường hợp sử dụng cụ thể của tôi là tự động thêm một khai báo biểu định kiểu xsl vào tệp xml Junit.

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml

yourownlinux.com/2015/04/ Lời là phần có liên quan của một đoạn giới thiệu được viết tốt cho sed.
chim
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.