Mam plik skryptu, który muszę zmodyfikować za pomocą innego skryptu, aby wstawić tekst w 8. wierszu.
Ciąg do wstawienia:, Project_Name=sowstest
do pliku o nazwie start
.
Próbowałem użyć awk i sed, ale moje polecenie jest zniekształcane.
sed -i '8i8 This is Line 8' FILE
wstawia w linii 8
8 This is Line 8
do pliku FILE
-i
dokonuje modyfikacji bezpośrednio w pliku PLIK, bez wyjścia na standardowe wyjście, jak wspomniał w komentarzach glenn jackman.
brew install gnu-sed
a następnie używaj tego zgsed
sed '8i\ 8 This is Line 8' FILE
.ed
odpowiedź.
na własnej linii kończy tryb wprowadzania;w
pisze;q
skwitowany. GNU ed mawq
polecenie zapisywania i zamykania, ale stare edy nie.Więcej informacji: https://gnu.org/software/ed/manual/ed_manual.html
źródło
OS X / macOS / FreeBSD
sed
-i
Flag działa inaczej na MacOSsed
niż w GNUsed
.Oto sposób korzystania z niego w systemie MacOS / OS X:
Zobacz,
man 1 sed
aby uzyskać więcej informacji.źródło
odpowiedź awk
źródło
#define SERVER@"http://10.35.42.54/ms0.8"
do określonej linii. Jak mogę to osiągnąć?>
jest symbolem przekierowania powłoki, dzięki czemu wyjście awk jest przechowywane w pliku o nazwie „plik.new”.POSIX
sed
(i na przykład OS Xsed
,sed
poniżej) wymagająi
odwrotnego ukośnika i nowej linii. Ponadto przynajmniej OS Xsed
nie zawiera nowej linii po wstawionym tekście:Aby zamienić linię, możesz użyć poleceń
c
(zmień) lubs
( zastąp ) z adresem numerycznym:Alternatywy wykorzystujące
awk
:awk
interpretuje ukośniki odwrotne w zmiennych przekazywanych,-v
ale nie w zmiennych przekazywanych przy użyciuENVIRON
:Obie
ENVIRON
i-v
są zdefiniowane przez POSIX.źródło
Rozwiązania Perl:
szybko i brudno:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l
usuwa nowe linie i dodaje je z powrotem, eliminując potrzebę „\ n”-p
zapętla plik wejściowy, wypisując każdy wiersz-e
wykonuje kod w apostrofach$.
to numer liniiodpowiednik rozwiązania awk @ glenn, używając nazwanych argumentów:
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s
włącza podstawowy parser argumentów--
zapobiega analizowaniu opcji -n i -s przez standardowy parser argumentów perlapozycyjne argumenty poleceń:
perl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
Zmienne środowiska:
ENV
to skrót zawierający wszystkie zmienne środowiskoweGetopt, aby przeanalizować argumenty w hash% o:
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
Getopt :: Długie i dłuższe nazwy opcji
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 to zalecane rozwiązanie w zakresie bibliotek standardowych.
Może to być przesada w przypadku jednowierszowych skryptów perl, ale można to zrobić
źródło
Dla tych, którzy korzystają z SunOS, który nie jest GNU, pomoże następujący kod:
źródło
sed -e '8iProject_Name=sowstest' -i start
używając seda GNUPrzykładowy przebieg:
źródło
$
pochodzące z linii 3 po wstawieniu?-A
flagi docat
:)sed -i "" -e $ '4 a \\ n'' Nazwa_projektu = sowstest' start
źródło