Как заменить строку на 3 строки / добавить 2 перед найденной / добавить 2 перед 1 с конца [закрыто]

Файл такой:

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
exit 0

Нужно, чтобы эти строки шли одна за другой:

echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

Итак, это выглядит так:

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch
exit 0

ПРОБЛЕМЫ - команда внутри команды внутри команды с большим количеством строк \n

Сейчас у меня есть команда sed -i 's/exit 0/echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0/gp' /usr/file, но в ней что-то не так - она не работает.

Update 1

"SLASHES" / на \/: Я нашел решение для слешей использовать \/ и обратных слешей \\\.

Теперь моя команда работает sed -i 's/exit 0/echo deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

Но его нужно изменить, потому что теперь он находит все выражения, но как так, что он находит строку, в которой больше ничего нет? Поэтому он не заменяет то, что находится в exit 0 в комментарии к файлу примера.

Update 2

По крайней мере строку, начинающуюся с ^: Нашел решение для этого файла sed 's/^exit 0/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file, но в случае если текстовый файл имеет строки:

exit 0
exit 0 means exiting

Тогда нельзя использовать ^ для поиска строки, начинающейся с выражения.

Поэтому лучшим способом будет тот, который я не могу найти, как найти точную строку, содержащую только выражение или найти строку с выражением, а не все выражения?

Update 3

Точная строка ^ & $: Tuns out ^ limits nothing to be on left side and $ nothing to be on right side so now working solution for 1. sed -i 's/^exit 0$/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

Я хочу узнать по крайней мере 3 способа, используя команды в одну строку. Как:

  1. заменить найденную строку на 3 строки с символом, содержащим команду, как упоминалось
  2. найти полную строку, а не только выражение и добавить 2 строки перед найденной
  3. добавить 2 строки в 1 строку перед концом
1
задан 4 February 2013 в 15:25

2 ответа

По вопросу 3: я полагаю, вы хотите добавить текст между последней и последней, но одной строкой в ​​файле. Кроме того, этот текст состоит из 2 строк, но это не имеет значения. head -n -1 извлечет все, кроме последней строки, а tail -n 1 извлечет последнюю строку. Таким образом, можно сделать

head -n -1 file > outputfile
cat file_with_two_line_text >> outputfile
tail -n 1 file >> outputfile

Это не очень эффективно, так как сканирует «файл» дважды, в то время как нужно сканировать его только один раз.

0
ответ дан 4 February 2013 в 15:25

Они могут работать для вас (все они достигают одного и того же!):

 sed '/^exit 0/i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

Поиск начала строки exit 0 и вставка 2 строк.

Или:

 sed '$i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

Вставить 2 строки перед последней строкой файла.

Или:

 sed '$c\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0' file

Изменить последнюю строку файла на 3 строки.

0
ответ дан 4 February 2013 в 15:25

Другие вопросы по тегам:

Похожие вопросы: