Yanıtlar:
sed -i '8i8 This is Line 8' FILE
8. hatta ekler
8 This is Line 8
FILE dosyasına
-i glenn jackman tarafından yapılan yorumlarda belirtildiği gibi, doğrudan dosyaya dosya, stdout çıktısı yok.
brew install gnu-sedve sonra bunu kullanıngsed
sed '8i\ 8 This is Line 8' FILE.
Bir edcevap
ed file << END
8i
Project_Name=sowstest
.
w
q
END
.kendi satırında giriş modunu bitirir; wyazıyor; qsonlandırılıyor. GNU ed'in wqkaydetme ve bırakma komutu vardır , ancak eski ed'ler yoktur.
Daha fazla okuma: https://gnu.org/software/ed/manual/ed_manual.html
sed-iBayrak MacOS üzerinde farklı çalışır sedGNU daha sed.
MacOS / OS X'te kullanmanın yolu:
sed -i '' '8i\
8 This is Line 8' FILE
Daha man 1 sedfazla bilgi için bakınız .
awk cevabı
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"Belirli bir satıra girmem gerekiyor . Bunu nasıl başarabilirim?
>için kabuk yönlendirme sembolüdür.
POSIX'i sed(ve örneğin OS X'leri sed, sedaşağıdaki) ibir ters eğik çizgi ve bir yeni satır izlemelidir. Ayrıca en azından OS sedX'ler eklenen metinden sonra yeni satır içermez:
$ 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
Bir satırı değiştirmek için, sayısal bir adresle c(değiştir) veya s(değiştir) komutlarını kullanabilirsiniz:
$ 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
Kullanan alternatifler 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
awkile iletilen değişkenlerdeki ters eğik çizgileri yorumlar, -vancak aşağıdakileri kullanarak geçirilen değişkenlerde değil 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
Her ikisi de ENVIRON ve -vPOSIX tarafından tanımlanır.
Perl çözümleri:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l yeni satırları çıkarır ve tekrar ekler, "\ n" ihtiyacını ortadan kaldırır-p Girdi dosyası üzerinde döngüler, her satırı yazdırma-e kodu tek tırnak içinde yürütür$. satır numarası
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s temel argüman ayrıştırıcısını etkinleştirir-- -n ve -s öğelerinin standart perl bağımsız değişken ayrıştırıcısı tarafından ayrıştırılmasını engellerperl -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 tüm ortam değişkenlerini içeren karma değerdir
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 önerilen standart kütüphane çözümüdür.
Bu, tek satırlık perl betikleri için aşırı olabilir, ancak yapılabilir
GNU olmayan SunOS'ta olanlar için aşağıdaki kod yardımcı olacaktır:
sed '1i\^J
line to add' test.dat > tmp.dat
sed -e '8iProject_Name=sowstest' -i start GNU sed kullanma
Örnek çalışma:
[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 ~]#
$Ekleme işleminden sonra 3. satırdaki iz nereden geliyor?
-Abayrağına cat:)
sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' başlat