2011-06-08 33 views
22

Làm cách nào để chèn một dòng vào một tệp bằng cách sử dụng sed trước một mẫu và sau một số dòng? Và làm thế nào để sử dụng tương tự trong shell script?làm thế nào để chèn một dòng bằng cách sử dụng sed trước một mẫu và sau một số dòng?

này chèn một dòng trước mỗi phù hợp với các mô hình:

sed '/Sysadmin/i \ Linux Scripting' filename.txt 

Và điều này thay đổi này sử dụng dải số dòng:

sed '1,$ s/A/a/' 

Bây giờ làm thế nào để sử dụng các cả (mà tôi couldn' t) để chèn một dòng vào một tập tin bằng cách sử dụng sed trước một mẫu và sau một số dòng hoặc cách tiếp cận khác?

Trả lời

21

Bạn có thể viết một tập tin kịch bản sed và sử dụng:

sed -f sed.script file1 ... 

Hoặc bạn có thể sử dụng (nhiều) -e 'command' lựa chọn:

sed -e '/SysAdmin/i\ 
Linux Scripting' -e '1,$s/A/a/' file1 ... 

Nếu bạn muốn thêm một cái gì đó sau khi một dòng, sau đó :

sed -e '234a\ 
Text to insert after line 234' file1 ... 
+0

Vì vậy, Jonathan, nếu tôi có xml trong định dạng này :: Mô tả Làm cách nào để sử dụng sed để thêm dòng "" trước thẻ? – Nohsib

+0

tôi đã tìm ra, nhờ sự giúp đỡ: sed -i -e '8, $ s/<\/vendor>/kiểm tra /' -e '/ kiểm tra/i \ '-e' 8, $ s/testing/<\/vendor>/'vendor1.xml – Nohsib

+0

để tôi làm việc này tại chỗ, tôi phải làm' sed -i '22a Văn bản tôi đã thêm ở dòng 22' test.txt' – jamescampbell

7

Tôi giả sử bạn muốn chèn dòng trước một mẫu chỉ khi đường cong số dòng thuê lớn hơn một số giá trị (tức là nếu mô hình xảy ra trước số dòng, không làm gì cả)

Nếu bạn không gắn với sed:

awk -v lineno=$line -v patt="$pattern" -v text="$line_to_insert" ' 
    NR > lineno && $0 ~ patt {print text} 
    {print} 
' input > output 
+0

+1: Tôi tự hỏi nếu đó là câu hỏi nên được giải thích quá, nhưng đã cho câu trả lời đơn giản mà dường như đã được hữu ích. Sẽ rất khó để đạt được hiệu ứng đó trong 'sed' - có lẽ không hoàn toàn không thể, nhưng liên quan đến các lệnh lồng nhau, v.v. –

0

đây là một ví dụ về cách chèn một dòng trước một dòng trong một tập tin:

dụ tập tin test.txt:

hello line 1 
hello line 2 
hello line 3 

kịch bản:

sed -n 'H;${x;s/^\n//;s/hello line 2/hello new line\n&/;p;}' test.txt > test.txt.2 

đầu ra tập tin test.txt.2

hello line 1 
hello new line 
hello line 2 
hello line 3 

NB! chú ý rằng sed đã bắt đầu thay thế một dòng mới thành không có dấu cách - điều này là cần thiết nếu không kết quả tệp sẽ có một dòng trống trong đầu

Kịch bản tìm dòng chứa "hello line 2", sau đó chèn một dòng dòng mới ở trên - "hello dòng mới"

giải thích các lệnh sed:

sed -n: 
suppress automatic printing of pattern space 

H;${x;s/test/next/;p} 

/<pattern>/ search for a <pattern> 
${} do this 'block' of code 
H put the pattern match in the hold space 
s/ substitute test for next everywhere in the space 
x swap the hold with the pattern space 
p Print the current pattern hold space. 
Các vấn đề liên quan