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