Добавление текста в строки файла 2 перед матчем последнего шаблона

Цитата из https://superuser.com/questions/72226/linux-live-cd-for-distributed-computing-projects

Dotsch / UX один.

Dotsch / UX - USB / бездисковый / жесткий диск BOINC Ubuntu Linux Distribution

Цель состоит в том, чтобы создать дистрибутив Linux для BOINC, который легко устанавливается и загружается с USB-накопителя, жесткого диска и бездисковых клиентов , а также имеет несколько интерфейсов для автоматической настройки бездискового сервера и клиентов .

Клиент BOINC: Клиент BOINC поставляется предварительно установленным и запускается как демон , и этот демон будет отслеживать и поддерживать в рабочем состоянии. Dotsch / UX 1.0 включает клиент BOINC 6.2.15. Dotsch / UX 1.1 включает клиент BOINC 6.4.5 для поддержки CUDA.

1
21.11.2018, 13:11
4 ответа

Используйте grep -nдля извлечения номера строки, затем используйте его в адресе sed для вставки текста, который должен быть правильно заключен в кавычки, т. е. перед каждой новой строкой должна быть обратная косая черта:

line=$(grep -n '# My Search' myfile.txt | tail -n1 | cut -f1 -d:)
((--line))
text=${TEXT//$'\n'/$'\\\n'}
text=${text%$'\\\n'}$'\n'

sed "$line i \\
$text" myfile.txt
2
28.01.2020, 00:23

tac +bash(замена переменных )+ подход GNUsed:

txt_reversed=$(echo "$TEXT" | tac)
tac myfile.txt \
| sed -e "N;N;N; s~#\n# My Search\n#~&${txt_reversed//$'\n'/\\n}\n~" | tac

Выход:

text1
text2
#
# My Search
#
text4
text5

[my search]
home=/var/home
string=random

#
# My Search
#
text6
0
28.01.2020, 00:23

Самый простой способ сделать это за один раз — использовать инструмент, который может выполнять поиск в обратном направлении, ed— один из них. В идеале вы должны сохранить текст в файле (, например.insert.txt)и вставьте содержимое файла за две строки до последнего вхождения PATTERN, чтобы вы могли запустить:

ed -s infile <<\IN
.t.
?PATTERN?-2r insert.txt
$d
,p
q
IN

Он находит последнее вхождение PATTERN, поднимается еще на 2строк и rчитает в insert.txt. Затем он печатает содержимое буфера через ,p. Замените его на w, если вы хотите отредактировать файл на месте -.


С другими инструментами, которые не могут выполнять поиск назад, можно использовать два -прохода :1-й проход -получить номер строки, а 2-й проход -вставить текстовое содержимое после строки NR-2или перед строкой NR-1. Для текста, сохраненного в переменной, я предпочитаю awkдругим инструментам, которые полагаются на регулярные выражения (последние требуют предварительной -обработки текста, который будет вставлен, чтобы избежать любых специальных символов :есть несколько инструментов, которые требуют экранирование, а не только новой строки, в зависимости от используемой техники):

export TEXT
awk 'NR==FNR{if ($0 ~ /PATTERN/){c=NR};next}
{if (FNR==(c-1)){print ENVIRON["TEXT"]}};1' infile infile
0
28.01.2020, 00:23

Мой первый вклад в stackExchange.

Вот как вставить строку с sedперед последним совпадением.

sed -e '/PATTERN[^\n]*/,$!b;//{x;//p;g};//!H;$!d;x;iTEXTOINSERT' FILE

Вот как вставить строку с sedперед первым совпадением.

sed -i -e '/PATERN/{a\\TEXTOINSERT' -e ':a;n;ba}' FILE

С уважением!

0
07.03.2021, 02:27

Теги

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