Ответы:
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