Jawaban:
sed -i '8i8 This is Line 8' FILE
sisipan di baris 8
8 This is Line 8
ke dalam file FILE
-i
melakukan modifikasi langsung ke file FILE, tidak ada output ke stdout, seperti yang disebutkan dalam komentar oleh glenn jackman.
brew install gnu-sed
dan kemudian gunakan ini dengangsed
sed '8i\ 8 This is Line 8' FILE
.
Sebuah ed
jawaban
ed file << END
8i
Project_Name=sowstest
.
w
q
END
.
pada jalurnya sendiri berakhir mode input; w
menulis; q
seri. GNU ed memiliki wq
perintah untuk menyimpan dan keluar, tetapi ed lama tidak.
Bacaan lebih lanjut: https://gnu.org/software/ed/manual/ed_manual.html
sed
The -i
bendera bekerja secara berbeda pada MacOS sed
daripada di GNU sed
.
Inilah cara menggunakannya di macOS / OS X:
sed -i '' '8i\
8 This is Line 8' FILE
Lihat man 1 sed
untuk info lebih lanjut.
jawaban 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"
ke jalur tertentu. Bagaimana saya bisa mencapai ini?
>
adalah simbol pengalihan shell sehingga output awk disimpan dalam file bernama "file.new".
POSIX sed
(dan misalnya OS X's sed
, di sed
bawah) perlu i
diikuti oleh garis miring terbalik dan baris baru. Setidaknya OS X sed
tidak menyertakan baris baru setelah teks yang dimasukkan:
$ 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
Untuk mengganti garis, Anda dapat menggunakan perintah c
(ubah) atau s
(ganti) dengan alamat numerik:
$ 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
Alternatif menggunakan 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
menafsirkan garis miring terbalik dalam variabel yang diteruskan dengan -v
tetapi tidak dalam variabel yang diteruskan menggunakan 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
Keduanya ENVIRON
dan -v
didefinisikan oleh POSIX.
Solusi Perl:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l
menghapus baris baru dan menambahkannya kembali, menghilangkan kebutuhan untuk "\ n"-p
loop di atas file input, mencetak setiap baris-e
mengeksekusi kode dalam tanda kutip tunggal$.
adalah nomor baris
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s
memungkinkan parser argumen yang belum sempurna--
mencegah -n dan -s diurai oleh parser argumen perl standarperl -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
adalah hash yang berisi semua variabel lingkungan
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 adalah solusi perpustakaan standar yang direkomendasikan.
Ini mungkin berlebihan untuk skrip perl satu baris, tetapi dapat dilakukan
Bagi mereka yang menggunakan SunOS yang bukan GNU, kode berikut akan membantu:
sed '1i\^J
line to add' test.dat > tmp.dat
sed -e '8iProject_Name=sowstest' -i start
menggunakan sed GNU
Contoh dijalankan:
[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 ~]#
$
pada jalur 3 setelah penyisipan?
-A
bendera ke cat
:)
sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' mulai