Вы можете запустить сценарий при загрузке, передав параметр загрузки ядра script
в файлах конфигурации загрузчика ISO.
Предполагается, что вы используете пакет archiso
для создания образа ISO.
Поместите свой сценарий где-нибудь, например releng/airootfs/root/install.sh
, и установите для сценария бит разрешения на выполнение.
В releng/efiboot/loader/entries/archiso-x86_64-cd.conf
добавьте script=/root/install.sh
к строке options
.
В releng/syslinux/archiso_sys.cfg
добавьте script=/root/install.sh
к строке APPEND
.
Предполагая, что значение $substitute
не содержит специальных символов, вы можете просто выполнить:
line=1
substitute=hello1
sed -i "${line}s/.*/$substitute/" file.txt
Сperl
:
export line substitute
perl -pi -e '$_ = $ENV{substitute}. "\n" if $. == $ENV{line}' file.txt
то же самое с GNUawk
:
export line substitute
gawk -i inplace 'NR == ENVIRON["line"] {$0 = ENVIRON["substitute"]}
{print}' file.txt
Использование sed
здесь не идеально, даже с теми, которые поддерживают параметр perl -, подобный -i
, так как нам потребуется выполнить некоторую пост--обработку значения $substitute
, если оно может содержать обратную косую черту, &
, разделитель команд s
или символы новой строки. См. Как гарантировать, что строка, интерполированная в подстановку `sed `, пропускает все метасимволы для получения подробной информации об этом.
Без дополнительной информации должна работать следующая awk
программа:
awk -v where="$line" -v what="$substitute" 'FNR==where {print what; next} 1' file.txt
$line
и $substitute
будут импортированы в переменные awk
where
и what
. 1
за пределами блока правил{... }
). FNR
равен номеру строки, хранящемуся в where
, вместо этого мы печатаем заменяющую строку what
и пропускаем выполнение до следующей входной строки. Обратите внимание, что awk
не редактирует файлы в месте -, поэтому вам придется перенаправить вывод и переименовать результирующий файл, как только вы будете удовлетворены. В качестве альтернативы, с достаточно новыми версиями GNU awk
, вы можете использовать опцию -i inplace
для изменения файла в месте -.
Обратите внимание , что (, как указано αғsнιη/Стефаном Шазеласом/Эдом Мортоном ), приведенное выше поведение покажет ошибочное поведение, если ваша substitute
строка содержит литерал \
, так как этот метод расширяет escape-последовательности. В этом случае альтернативное решение на основеawk
-в ответе Стефана Шазела с экспортом переменной и ссылкой на нее как ENVIRON["substitute"]
поможет (см. этот ответ для получения дополнительной информации ).
Предполагая line >0
и всегда int , вы могли бы сделать:
<infile head -n$(($line-1)); printf '%s\n' "$substitute"; tail -n +$(($line+1)) infile
Обратите внимание, что это добавит значение $substitute
в конец файла, если строка _номер $line
> _номер файла _из _строк
$ line=1 substitute=hello1
$ sed -nf - <<eof file
$line r $(t=$(mktemp);printf '%s\n' "$substitute" > "$t";echo "$t")
$line!p
eof
Мы используем heredoc для передачи кода sed. Код sed читает файл и помещает содержимое jts в стандартный вывод и подавляет исходную строку благодаря опции -n
.
Если:
$line
содержит фактический номер строки файла (не равно -нулю, не больше последней строки )и $substitute
не равно одному периоду(.
)тогда вы можете использовать скрипт ed
:
printf '%dc\n%s\n.\nw\nq' "$line" "$substitute" | ed -s input
Это отправляет несколько строк команд в качестве входных данных дляed
:
c
изменить строку, представленную$line
$substitute
.
w
записать измененный файл обратно на диск q
в комплекте Конечно, поскольку проверки -на ошибки нет, $line
и $substitute
необходимо соблюдать предположения, приведенные выше. Окружающий сценарий оболочки мог бы проверить работоспособность -переменной $line
, но ввод голого .
в качестве входных данных для ed
потребовал бы дополнительных усилий.