Ответы:
sed -i '8i8 This is Line 8' FILE
вставляет в строку 8
8 This is Line 8
в файл FILE
-i вносит изменения непосредственно в файл FILE, но не выводит в stdout, как указано в комментариях glenn jackman.
brew install gnu-sedа затем используйте это сgsed
sed '8i\ 8 This is Line 8' FILE.
edответ
ed file << END
8i
Project_Name=sowstest
.
w
q
END
.на собственной строке заканчивается режим ввода; wпишет; qквиты. В GNU ed есть wqкоманда для сохранения и выхода, а для старого - нет.
Дополнительная информация: https://gnu.org/software/ed/manual/ed_manual.html.
sed-iФлаг работает по- разному на MacOS , sedчем в GNU sed.
Вот способ использовать его в macOS / OS X:
sed -i '' '8i\
8 This is Line 8' FILE
Смотрите man 1 sedдля получения дополнительной информации.
ответ 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"в определенную строку. Как мне этого добиться?
>является символом перенаправления оболочки, поэтому выходные данные awk хранятся в файле с именем «file.new».
POSIX sed(и, например, OS X sed, sedниже) требуют iобратной косой черты и новой строки. Также по крайней мере OS Xsed не включает перевод строки после вставленного текста:
$ 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
Чтобы заменить строку, вы можете использовать c(изменить) или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
Альтернативы, использующие 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интерпретирует обратную косую черту в переменных, переданных, -vно не в переменных, переданных с помощью 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
И то, ENVIRONи другое -vопределяется POSIX.
Perl решения:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l удаляет новые строки и добавляет их обратно, устраняя необходимость в "\ n"-p перебирает входной файл, печатая каждую строку-e выполняет код в одинарных кавычках$. это номер строки
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s включает элементарный анализатор аргументов-- предотвращает синтаксический анализ -n и -s стандартным анализатором аргументов perlperl -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 это хеш, который содержит все переменные среды
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 является рекомендуемым решением стандартной библиотеки.
Это может быть излишним для однострочных скриптов Perl, но это может быть сделано
Для тех, кто работает на SunOS, не являющейся GNU, следующий код поможет:
sed '1i\^J
line to add' test.dat > tmp.dat
sed -e '8iProject_Name=sowstest' -i start используя GNU sed
Образец прогона:
[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 ~]#
$в строке 3 после вставки?
-Aфлага cat:)
sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start