Файл такой:
#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
, но в ней что-то не так - она не работает.
"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
в комментарии к файлу примера.
По крайней мере строку, начинающуюся с ^
: Нашел решение для этого файла 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
Тогда нельзя использовать ^
для поиска строки, начинающейся с выражения.
Поэтому лучшим способом будет тот, который я не могу найти, как найти точную строку, содержащую только выражение или найти строку с выражением, а не все выражения?
Точная строка ^
& $
: 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 способа, используя команды в одну строку. Как:
По вопросу 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
Это не очень эффективно, так как сканирует «файл» дважды, в то время как нужно сканировать его только один раз.
Они могут работать для вас (все они достигают одного и того же!):
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 строки.