Замена подстроки в sed по регулярке.

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

Замена подстроки в sed по регулярке.

#1

01 дек 2021, 13:00

Дано, текстовый файл в формате последовательности полей
{размер кб}{пробел}{сумма md5}{два пробела}{абсолютный путь}
типа такого:

Код: Выделить всё

2048 5ff7622fccf79045c38273d506fc32b7  /tmp/dir1/somefile1.pdf
168 7fd0b7cf1740dbe974f3d8c0686679bf  /tmp/other file #1.pdf
0 d41d8cd98f00b204e9800998ecf8427e  /tmp/dir2/dir3/all/783/Документ.docx
В целом структура попадает под паттерн [0-9]{1,}\ [a-f0-9]{32}\ \ /tmp/.*

задача собрать из этого списка валидный csv вставив пару разделителей (например (|)) между полями.

Код: Выделить всё

2048|5ff7622fccf79045c38273d506fc32b7|/tmp/dir1/somefile1.pdf
168|7fd0b7cf1740dbe974f3d8c0686679bf|/tmp/other file #1.pdf
0|d41d8cd98f00b204e9800998ecf8427e|/tmp/dir2/dir3/all/783/Документ.docx
Осложняется тем, что имя файла также может содержать пробелы и менять их не нужно.



Как бы сказать sed'у заменить символы между полями не обращая внимания на них в путях? :scratch:

Решение rogoznik » 01 дек 2021, 13:26
Chocobo, как-то так

Код: Выделить всё

sed -i 's/\([0-9]\{1,\}\)\ \([a-f0-9]\{32\}\)\ \ \(.*\)/\1,\2,\3/' test.txt
Chocobo писал(а):
01 дек 2021, 13:00
168 7fd0b7cf1740dbe974f3d8c0686679bf /tmp/other file #1.pdf
только у тебя тут во втором случае 3 пробела

Перейти к ответу ➙
Изображение
   
Изображение

Аватара пользователя

rogoznik
Сообщения: 10015
Зарегистрирован: 27 июн 2017, 13:36
Решено: 128
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1950 раз
Контактная информация:

замена подстроки в sed по регулярке.

#2

01 дек 2021, 13:26

Chocobo, как-то так

Код: Выделить всё

sed -i 's/\([0-9]\{1,\}\)\ \([a-f0-9]\{32\}\)\ \ \(.*\)/\1,\2,\3/' test.txt
Chocobo писал(а):
01 дек 2021, 13:00
168 7fd0b7cf1740dbe974f3d8c0686679bf /tmp/other file #1.pdf
только у тебя тут во втором случае 3 пробела
ИзображениеИзображение

Аватара пользователя

Автор темы
Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

Замена подстроки в sed по регулярке.

#3

01 дек 2021, 13:36

rogoznik, Ага, прекрасно) это мне и было интересно как выглядит подстановка. Спасибо! :thumbs:

Сам сформировал пока авком, но оно покатит только если пробелов меньше чем их напишем на вывод, что менее универсально)
awk '{print $1 "|" $2 "|" $3 " " $4 " " $5 " " $6}'

сказать ему "с третьего поля и до финала" пока не вышло, циклом с NF обрубает строку
Изображение
   
Изображение

Ответить

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя