The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"sed/grep - заменить вхождение строки"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"sed/grep - заменить вхождение строки"  +/
Сообщение от Аноним (0), 29-Дек-20, 10:55 
Добрый день. Мне нужно заменить все вхождения строки в файле, но только в тех случаях, когда некоторая последовательность в строке не найдена. Возможно ли это осуществить в sed, как будет выглядеть регулярное выражение? Спасибо.

Также я пытался подобрать подходящий паттерн для grep, тоже ничего не получилось. Мне нужны все совпадения строк, только если строка не включает в себя другую строку ("решено" цепочкой из 2 grep).

В общем-то, я озаботился из-за того, что это достаточно частая задача. И я не совсем понимаю, как её решить в sed.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от Аноним (1), 29-Дек-20, 11:11   +/
Как-то так:

grep -v "решено" filename.txt |sed -E 's/pattern/замена/'

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #2

2. Сообщение от Аноним (0), 29-Дек-20, 11:39   +/
Это не то. Мне нужно заменить строки в файле и сохранить неподходящие нетронутыми. Допустим есть файл со строками

gsjxfjhdfsjgkd    abc jkd^$!sgjh
kld'lkhg  abc drty&tsf \
g!"hs cba ^^^^^^^^^^^^\;& abc    ;lj

мне нужно заменить только строки с abc и не трогать те, в которых имеется cba, при этом желательно сматчить все элементы (особенно строку до совпадения и строку после) в группы, чтобы на них можно было ссылаться.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #3, #4

3. Сообщение от universite (ok), 29-Дек-20, 15:13   +/
> Это не то. Мне нужно заменить строки в файле и сохранить неподходящие
> нетронутыми. Допустим есть файл со строками
>
gsjxfjhdfsjgkd    abc jkd^$!sgjh 
> kld'lkhg  abc drty&tsf \
> g!"hs cba ^^^^^^^^^^^^\;& abc    ;lj

> мне нужно заменить только строки с abc и не трогать те, в
> которых имеется cba, при этом желательно сматчить все элементы (особенно строку
> до совпадения и строку после) в группы, чтобы на них можно
> было ссылаться.

Значит, набирайте тестовый набор данный и делайте регулярку.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #7

4. Сообщение от Аноним (4), 29-Дек-20, 15:25   +/
> Это не то. Мне нужно заменить строки в файле и сохранить неподходящие
> нетронутыми. Допустим есть файл со строками
>
gsjxfjhdfsjgkd    abc jkd^$!sgjh 
> kld'lkhg  abc drty&tsf \
> g!"hs cba ^^^^^^^^^^^^\;& abc    ;lj

> мне нужно заменить только строки с abc и не трогать те, в
> которых имеется cba, при этом желательно сматчить все элементы (особенно строку
> до совпадения и строку после) в группы, чтобы на них можно
> было ссылаться.


cat input.txt

gsjxfjhdfsjgkd    abc jkd^$!sgjh
kld'lkhg  abc drty&tsf \
g!"hs cba ^^^^^^^^^^^^\;& abc    ;lj



grep -v "cba" input.txt | sed 's/abc/ABC/g'

gsjxfjhdfsjgkd    ABC jkd^$!sgjh
kld'lkhg  ABC drty&tsf \


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #5

5. Сообщение от Аноним (0), 29-Дек-20, 15:36   +/
Строка с cba потерялась, она просто должна остаться неизменной в результирующем файле. Поэтому должно быть правило для седа, без всяких грепов. Греп я упомянул в контексте egrep.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #6

6. Сообщение от Аноним (4), 29-Дек-20, 15:38   +/
> Строка с cba потерялась, она просто должна остаться неизменной в результирующем файле.
> Поэтому должно быть правило для седа, без всяких грепов. Греп я
> упомянул в контексте egrep.


sed '/cba/!s/abc/ABC/g' input.txt

Ответить | Правка | Наверх | 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 | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру