LINUX.ORG.RU

Добавление текста не в конец файла

 , ,


0

1

Нужно добавить строки между строк, точнее на две строки выше последних двух строк. Есть идеи?

cat simple
str1
str2
str3
str4
str5
str6

echo sometext >> simple
cat simple
str1
str2
str3
str4
sometext
str5
str6

echo sometext >> simple
cat simple
str1
str2
str3
str4
sometext
sometext
str5
str6

Если в тупую (а особых условий и не было), то:

"simple" |> File.write!("simple" |> File.read!() |> String.split("\n") |> List.insert_at(-3, "sometext") |> Enum.join("\n"))

ddidwyll ★★★★
()
Ответ на: комментарий от TDrive

На словах алгоритм неплохой. Я бы сказал что можно просто впихнуть текст между строк, но компьютер меня не поймёт)

WildUser
() автор топика
Ответ на: комментарий от ddidwyll

Условие постоянно дописывать в файл перед последними двумя строками. Ваш код не сработал и я не совсем не понимаю синтаксис. Был тут челвоек один, он с sed творил чудеса, а ещё с awk. Удивлён что нет этих утилит в вашем предложении.

WildUser
() автор топика
Ответ на: комментарий от TDrive

Я хочу знать хотя бы какой утилитой это можно сделать. Моих знаний недостаточно. Гугл молчит. А как запрос правильно сделать? «Ок гугл, как записать строки в пред-пред последнюю строку?»

WildUser
() автор топика
Ответ на: комментарий от WildUser

А ты готовый код хотел? Я тебе описал алгоритм.

ddidwyll ★★★★
()
Ответ на: комментарий от WildUser

я бы на каком нибудь нормальном скриптовом ЯП написал, не на баше. там код то элементарный. прочитать->отредактировать->сохранить, с башем и седом это изврат какой то.

TDrive ★★★★★
()
Ответ на: комментарий от WildUser

Ваш код не сработал

Да кстати говоря, работает, сам попробуй:

❯ echo 'l1\nl2\nl3\nl4\nl5' > simple
❯ elixir wild_user.exs
❯ elixir wild_user.exs
❯ cat simple

❯ cat wild_user.exs
"simple" |> File.write!("simple" |> File.read!() |> String.trim() |> String.split("\n") |> List.insert_at(-3, "sometext") |> Enum.join("\n"))
ddidwyll ★★★★
()

Они похоже над тобой издеваются. Тебе нужен только head и tail.

head -n -2 simple > simple.tmp
echo "sometext" >> simple.tmp
tail -n 2 simple >> simple.tmp
mv simple.tmp simple

adn ★★★★
()
Ответ на: комментарий от ddidwyll

Условие немного другое, я изначально не уточнил. str5 - постоянная, её имя известно и она одна в файле. sed '/str5/ i sometext' simple Это выводит то что нужно, но как изменения записать в этот файл?

WildUser
() автор топика
Ответ на: комментарий от adn

Хорошее монолитнокирпичное решение, но нужно именно дописать. Такая перезапись не подойдёт программе ни в какую.

WildUser
() автор топика
echo -e '--a\nXXX\nYYY\n.\n,p\nQ' | ed -s simple
anonymous
()
Ответ на: комментарий от WildUser

Звучит заманчиво. Цель - короче код и меньше нагрузка на процессор)

Что тут заманчивого то?
Это простая лаба.

Советую вам без помощи других ее сделать ... 
anonymous
()
Ответ на: комментарий от anonymous

Советую вам без помощи других ее сделать …

А дальше огородами, огородами, … и VS CODE разработаете!

anonymous
()
Ответ на: комментарий от ddidwyll

Почему не вставляется переменная? sed -i 's/str5/$var\nstr5/' simple Так и записывает $var в строку. Первый мой скрипт где переменная не работает. Что не так? Уточню. В переменной несколько строк будет.

WildUser
() автор топика
Последнее исправление: WildUser (всего исправлений: 1)
Ответ на: комментарий от WildUser

Придётся тебе всё таки ждать специалиста по sed'ам, ну или взять уже что-нибудь попроще. Ну или прочитать man sed что ли.

Хотя у меня вроде бы работает:

❯ echo 'l1\nl2\nl3\nl4\nl5' > simple
❯ VAR="lol\nkek\neee"
❯ sed -i "s/l5/$VAR\nl5/" simple
❯ cat simple
l1
l2
l3
l4
lol
kek
eee
l5

ddidwyll ★★★★
()
Последнее исправление: ddidwyll (всего исправлений: 1)

Тебе нужно одним sed-ом обойтись что ли?

У тебя не получится одним только sed-ом адресовать «выше последних двух строк». Потому что sed идёт по порядку и считает строки от первой до последней.

Два варианта.

Первый.

Перевернуть все строки при помощи tac. Решить задачу «добавить новые строки после второй строки». Перевернуть все строки при помощи tac обратно.

Второй. Сначала подсчитать количество строк в файле при помощи wc -l. Составить команду для sed. которая вставляет строки в нужном месте с учётом вычисленных номеров строк.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 2)
Ответ на: комментарий от wandrien

Парадокс, но тот кто умеет четко сформулировать задачу, чаще всего и выполнить её сможет.

ddidwyll ★★★★
()
Ответ на: комментарий от wandrien

Не обязательно только sed’om но хочется короткий код и скорость обработки. Что если удалить последние две строки, дописать в файл и дописать недостающие две строки без создания файлов как здесь Добавление текста не в конец файла (комментарий)

WildUser
() автор топика
Ответ на: комментарий от wandrien

Задача простая. Есть файл который читает программа. Но без последних двух строк она его не может читать.(закрывающие теги) Нужно добавить кусок кода перед закрытием тегов что бы программа продолжала спокойно читать с файл с новыми данными.

WildUser
() автор топика
Ответ на: комментарий от WildUser

Заменил - вот резальтат.

В переменной не должно быть переводов строк. Она должна быть в виде, пригодном для вставки в команду s sed-а. То есть вместо переводов строк должен быть \n, а все \ должны быть заменены на двойные \\. И тогда всё работает, как в примере ddidwyll

wandrien ★★
()
Ответ на: комментарий от wandrien

Блин, да сейчас попробовал в чистом sh, там не экранируется, zsh видимо за меня это делал или какой-то плагин, а я и привык уже.

ddidwyll ★★★★
()
Ответ на: комментарий от ddidwyll

Поэтому при программировании скриптов, которым предстоит работать неизвестно где в неизвестно какой оболочке, используется printf вместо echo, так как у него поведение предсказуемо. Или первым делом объявляется функция на замену echo.

wandrien ★★
()
Ответ на: комментарий от wandrien

У меня работает этот код если переменная простая аля вася=валера, но у меня там другая лапша из седов

var=$(cat template | sed s/str1/vasya/ | sed s/str2/valera/)
sed -i "s/str5/$var\n\0/" simple

sh script
sed: -e expression #1, char 19: unterminated `s' command
WildUser
() автор топика
Ответ на: комментарий от wandrien

Как хорошо, что мне это знать без надобности :)

ddidwyll ★★★★
()
Ответ на: комментарий от WildUser

это код с тегами

xml, html? Возьми уже что-нибудь простое, вроде питона, и не мучайся. Ну или читай как правильно экранировать то, что ты вставляешь.

ddidwyll ★★★★
()
Последнее исправление: ddidwyll (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.