Saya memiliki file skrip yang perlu saya modifikasi dengan skrip lain untuk memasukkan teks pada baris ke-8.
String untuk memasukkan:, Project_Name=sowstest
ke dalam file bernama start
.
Saya mencoba menggunakan awk dan sed, tetapi perintah saya semakin kacau.
brew install gnu-sed
dan kemudian gunakan ini dengangsed
sed '8i\ 8 This is Line 8' FILE
.Sebuah
ed
jawaban.
pada jalurnya sendiri berakhir mode input;w
menulis;q
seri. GNU ed memilikiwq
perintah untuk menyimpan dan keluar, tetapi ed lama tidak.Bacaan lebih lanjut: https://gnu.org/software/ed/manual/ed_manual.html
sumber
OS X / macOS / FreeBSD
sed
The
-i
bendera bekerja secara berbeda pada MacOSsed
daripada di GNUsed
.Inilah cara menggunakannya di macOS / OS X:
Lihat
man 1 sed
untuk info lebih lanjut.sumber
jawaban awk
sumber
#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'ssed
, dised
bawah) perlui
diikuti oleh garis miring terbalik dan baris baru. Setidaknya OS Xsed
tidak menyertakan baris baru setelah teks yang dimasukkan:Untuk mengganti garis, Anda dapat menggunakan perintah
c
(ubah) ataus
(ganti) dengan alamat numerik:Alternatif menggunakan
awk
:awk
menafsirkan garis miring terbalik dalam variabel yang diteruskan dengan-v
tetapi tidak dalam variabel yang diteruskan menggunakanENVIRON
:Keduanya
ENVIRON
dan-v
didefinisikan oleh POSIX.sumber
Solusi Perl:
cepat dan kotor:
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 barissetara dengan solusi awk @ glenn, menggunakan argumen bernama:
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 standarargumen perintah posisi:
perl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
variabel lingkungan:
ENV
adalah hash yang berisi semua variabel lingkunganGetopt to parse argumen ke hash% o:
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
Getopt :: Nama opsi yang panjang dan lebih panjang
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
sumber
Bagi mereka yang menggunakan SunOS yang bukan GNU, kode berikut akan membantu:
sumber
sed -e '8iProject_Name=sowstest' -i start
menggunakan sed GNUContoh dijalankan:
sumber
$
pada jalur 3 setelah penyisipan?-A
bendera kecat
:)sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' mulai
sumber