![]() |
Пред. тема | След. тема | ||
Форум Программирование под UNIX (Shell скрипты) | |||
---|---|---|---|
Изначальное сообщение | [ Отслеживать ] |
"sed/grep - заменить вхождение строки" | +/– | ![]() |
Сообщение от Аноним (0), 29-Дек-20, 10:55 | ||
Добрый день. Мне нужно заменить все вхождения строки в файле, но только в тех случаях, когда некоторая последовательность в строке не найдена. Возможно ли это осуществить в sed, как будет выглядеть регулярное выражение? Спасибо. | ||
Ответить | Правка | Cообщить модератору |
Оглавление |
Сообщения | [Сортировка по ответам | RSS] |
1. Сообщение от Аноним (1), 29-Дек-20, 11:11 | +/– | ![]() |
Как-то так: | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Ответы: #2 |
2. Сообщение от Аноним (0), 29-Дек-20, 11:39 | +/– | ![]() |
Это не то. Мне нужно заменить строки в файле и сохранить неподходящие нетронутыми. Допустим есть файл со строками | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #1 Ответы: #3, #4 |
3. Сообщение от universite (ok), 29-Дек-20, 15:13 | +/– | ![]() |
> Это не то. Мне нужно заменить строки в файле и сохранить неподходящие | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #2 Ответы: #7 |
4. Сообщение от Аноним (4), 29-Дек-20, 15:25 | +/– | ![]() |
> Это не то. Мне нужно заменить строки в файле и сохранить неподходящие | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #2 Ответы: #5 |
5. Сообщение от Аноним (0), 29-Дек-20, 15:36 | +/– | ![]() |
Строка с cba потерялась, она просто должна остаться неизменной в результирующем файле. Поэтому должно быть правило для седа, без всяких грепов. Греп я упомянул в контексте egrep. | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #4 Ответы: #6 |
6. Сообщение от Аноним (4), 29-Дек-20, 15:38 | +/– | ![]() |
> Строка с cba потерялась, она просто должна остаться неизменной в результирующем файле. | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #5 Ответы: #8, #9 |
7. Сообщение от Аноним (0), 29-Дек-20, 15:45 | +/– | ![]() |
Я пытался добавить условия к паттерну, чтобы он не совпадал при совпадении некоторой подстроки, но в результате у меня получилось только собрать и совпадающие и не совпадающие строки. Это не работает, поскольку это одновременно одна и та же строка будет. Перловое lookahead тоже не подошло -- либо это не то, что мне нужно, либо я не понял, как в данном случае применить (в идеале перла нужно избежать). | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #3 |
8. Сообщение от Аноним (0), 29-Дек-20, 15:50 | +/– | ![]() |
Это опять не регулярка, т.е. нельзя засунуть в греп, например. Ну ладно, в целом, этого достаточно для решения задачи, конечно. Благодарю. | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #6 |
9. Сообщение от Аноним (0), 29-Дек-20, 17:28 | +/– | ![]() |
Можно усложнить задачу? Нужно проверить чтобы каждое совпадение паттерна существовало на диске, в этом случае замену не выполнять. Либо выполнять для несуществующих файлов. Потом проверять на существование эту замену, и если ни оригинальный, ни результирующий файл по какой-то причине не существует на диске, выводить ошибку. Ведь типичная задача для sed, во всяком случае gnu sed вызывает внешние команды. Я могу вызвать из седа шелл, чтобы тот дополнил мне имя файла на диске. Или даже проверит существование и всё это, но это ведь дополнительный процесс на каждую строку и их там тысячи. Нельзя это осуществить только средствами седа? | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #6 Ответы: #10 |
10. Сообщение от Аноним (0), 29-Дек-20, 19:30 | +/– | ![]() |
С этим возник ряд проблем. Я не смог придумать как вызвать ошибку и остановить сед, пришлось заменить на текст "не найдено ххх". Вообще грязновато вышло, но забавно. Пришлось матчить все символы, а не только нужные, иначе жаловалась на $ и скобочки в строке. Буквально добавить (.*) по краям. А ещё в файле \r в строках, это я тоже не заметил заранее. А так sed exec вполне норм, справляется (через bash -c не получилось правда, пришлось однострочник в отдельный файл пихать). Видимо, ещё и extglob нужен. | ||
Ответить | Правка | Наверх | Cообщить модератору | ||
Родитель: #9 |
Архив | Удалить |
Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема |
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |