У меня есть файл сценария, который мне нужно изменить с помощью другого сценария, чтобы вставить текст в 8-й строке.
Строка для вставки:, Project_Name=sowstest
в файл с именем start
.
Я пытался использовать awk и sed, но моя команда искажается.
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
ответ.
на собственной строке заканчивается режим ввода;w
пишет;q
квиты. В GNU ed естьwq
команда для сохранения и выхода, а для старого - нет.Дополнительная информация: https://gnu.org/software/ed/manual/ed_manual.html.
источник
OS X / macOS / FreeBSD
sed
-i
Флаг работает по- разному на MacOS ,sed
чем в GNUsed
.Вот способ использовать его в macOS / OS X:
Смотрите
man 1 sed
для получения дополнительной информации.источник
ответ awk
источник
#define SERVER@"http://10.35.42.54/ms0.8"
в определенную строку. Как мне этого добиться?>
является символом перенаправления оболочки, поэтому выходные данные awk хранятся в файле с именем «file.new».POSIX
sed
(и, например, OS Xsed
,sed
ниже) требуютi
обратной косой черты и новой строки. Также по крайней мере OS Xsed
не включает перевод строки после вставленного текста:Чтобы заменить строку, вы можете использовать
c
(изменить) илиs
(заменить) команды с числовым адресом:Альтернативы, использующие
awk
:awk
интерпретирует обратную косую черту в переменных, переданных,-v
но не в переменных, переданных с помощьюENVIRON
:И то,
ENVIRON
и другое-v
определяется POSIX.источник
Perl решения:
быстро и грязно:
perl -lpe 'print "Project_Name=sowstest" if $. == 8' file
-l
удаляет новые строки и добавляет их обратно, устраняя необходимость в "\ n"-p
перебирает входной файл, печатая каждую строку-e
выполняет код в одинарных кавычках$.
это номер строкиэквивалентно решению awk @ glenn с использованием именованных аргументов:
perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file
-s
включает элементарный анализатор аргументов--
предотвращает синтаксический анализ -n и -s стандартным анализатором аргументов perlаргументы позиционной команды:
perl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file
переменные среды:
ENV
это хеш, который содержит все переменные средыПолучите парсинг аргументов в хеш% o:
perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file
Getopt :: Длинные и длинные имена опций
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 -e '8iProject_Name=sowstest' -i start
используя GNU sedОбразец прогона:
источник
$
в строке 3 после вставки?-A
флагаcat
:)sed -i "" -e $ '4 a \\ n''Project_Name = sowstest' start
источник