Câu trả lời:
sed -i '8i8 This is Line 8' FILE
chèn vào dòng 8
8 This is Line 8
vào tập tin TẬP TIN
-i
thực hiện sửa đổi trực tiếp để tập tin FILE, không xuất ra thiết bị xuất chuẩn, như được đề cập trong các bình luận của glenn jackman.
brew install gnu-sed
và sau đó sử dụng cái này vớigsed
sed '8i\ 8 This is Line 8' FILE
.
Một ed
câu trả lời
ed file << END
8i
Project_Name=sowstest
.
w
q
END
.
trên dòng riêng của nó kết thúc chế độ đầu vào; w
viết; q
bỏ cuộc. GNU ed có một wq
lệnh để lưu và thoát, nhưng ed cũ thì không.
sed
Các -i
lá cờ làm việc khác nhau trên hệ điều hành MacOS sed
hơn trong GNU sed
.
Đây là cách để sử dụng nó trên macOS / OS X:
sed -i '' '8i\
8 This is Line 8' FILE
Xem man 1 sed
để biết thêm.
câu trả lời awk
awk -v n=8 -v s="Project_Name=sowstest" 'NR == n {print s} {print}' file > file.new
#define SERVER@"http://10.35.42.54/ms0.8"
một dòng cụ thể. Làm thế nào tôi có thể đạt được điều này?
>
là biểu tượng chuyển hướng shell để đầu ra của awk được lưu trữ trong tệp có tên "file.new".
POSIX sed
(và ví dụ như OS X sed
, sed
bên dưới) yêu cầu i
phải được theo sau bởi dấu gạch chéo ngược và dòng mới. Ngoài ra, ít nhất OS X sed
không bao gồm một dòng mới sau khi văn bản được chèn:
$ seq 3|gsed '2i1.5'
1
1.5
2
3
$ seq 3|sed '2i1.5'
sed: 1: "2i1.5": command i expects \ followed by text
$ seq 3|sed $'2i\\\n1.5'
1
1.52
3
$ seq 3|sed $'2i\\\n1.5\n'
1
1.5
2
3
Để thay thế một dòng, bạn có thể sử dụng các lệnh c
(thay đổi) hoặc s
(thay thế) bằng một địa chỉ số:
$ seq 3|sed $'2c\\\n1.5\n'
1
1.5
3
$ seq 3|gsed '2c1.5'
1
1.5
3
$ seq 3|sed '2s/.*/1.5/'
1
1.5
3
Các lựa chọn thay thế sử dụng awk
:
$ seq 3|awk 'NR==2{print 1.5}1'
1
1.5
2
3
$ seq 3|awk '{print NR==2?1.5:$0}'
1
1.5
3
awk
diễn giải dấu gạch chéo ngược trong các biến được truyền với -v
nhưng không phải trong các biến được truyền bằng cách sử dụng ENVIRON
:
$ seq 3|awk -v v='a\ba' '{print NR==2?v:$0}'
1
a
3
$ seq 3|v='a\ba' awk '{print NR==2?ENVIRON["v"]:$0}'
1
a\ba
3
Cả hai ENVIRON
và -v
được xác định bởi POSIX.
Giải pháp Perl:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l
loại bỏ các dòng mới và thêm chúng trở lại, loại bỏ sự cần thiết cho "\ n"-p
vòng lặp trên tập tin đầu vào, in mọi dòng-e
thực thi mã trong dấu ngoặc đơn$.
là số dòng
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s
cho phép trình phân tích cú pháp đối số thô sơ--
ngăn -n và -s khỏi bị phân tích cú pháp bởi trình phân tích cú pháp đối số perl tiêu chuẩnperl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
setenv n 8 ; setenv s "Project_Name=sowstest"
echo $n ; echo $s
perl -slpe 'print $ENV{s} if $. == $ENV{n}' file
ENV
là hàm băm chứa tất cả các biến môi trường
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
perl -MGetopt::Long -lpe 'BEGIN{GetOptions(\%o,"line=i","string=s")}; print $o{string} if $. == $o{line}' -- --line 8 --string "Project_Name=sowstest" file
Getopt là giải pháp thư viện tiêu chuẩn được đề xuất.
Điều này có thể là quá mức cần thiết cho các tập lệnh perl một dòng, nhưng nó có thể được thực hiện
Đối với những người dùng SunOS không phải là GNU, đoạn mã sau sẽ giúp:
sed '1i\^J
line to add' test.dat > tmp.dat
sed -e '8iProject_Name=sowstest' -i start
sử dụng GNU sed
Chạy mẫu:
[root@node23 ~]# for ((i=1; i<=10; i++)); do echo "Line #$i"; done > a_file
[root@node23 ~]# cat a_file
Line #1
Line #2
Line #3
Line #4
Line #5
Line #6
Line #7
Line #8
Line #9
Line #10
[root@node23 ~]# sed -e '3ixxx inserted line xxx' -i a_file
[root@node23 ~]# cat -An a_file
1 Line #1$
2 Line #2$
3 xxx inserted line xxx$
4 Line #3$
5 Line #4$
6 Line #5$
7 Line #6$
8 Line #7$
9 Line #8$
10 Line #9$
11 Line #10$
[root@node23 ~]#
[root@node23 ~]# sed -e '5ixxx (inserted) "line" xxx' -i a_file
[root@node23 ~]# cat -n a_file
1 Line #1
2 Line #2
3 xxx inserted line xxx
4 Line #3
5 xxx (inserted) "line" xxx
6 Line #4
7 Line #5
8 Line #6
9 Line #7
10 Line #8
11 Line #9
12 Line #10
[root@node23 ~]#
$
đến từ dòng 3 sau khi chèn?
-A
cờ cat
:)
sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' bắt đầu