Удаление поворяющихся фраз через bash

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

Автор темы
madesta
Сообщения: 196
Зарегистрирован: 11 июн 2017, 18:47
Решено: 6
Откуда: Минск, BY
Благодарил (а): 19 раз
Поблагодарили: 45 раз

Удаление поворяющихся фраз через bash

Сообщение madesta » 27 фев 2019, 11:36

Имеются файлы отчётов, в которых присутствует повторяющихся путь и далее имена файлов и/или папок.
Например:
/path/file.txt
/path/file.odt
path/folder1
path/folder1/file.avi
path/folder2
path/folder2/file.mp3
/path/folder2/file.ogg

Может кто-нибудь подсказать команду bash для удаления в файле повторяющегося пути /path/ или какой раздел man попытаться изучить?

Решение darkfenix » 28 фев 2019, 03:13
madesta писал(а):
27 фев 2019, 19:56
Если следовать инструкции 's/старое_слово/новое_слово/',
Тут нужно понять принцип.
Если там где "старое_слово" есть / его надо экранировать что и сделано в моем примере скрипта /\/path/ - \ перед /path.
В твоем случае есть путь /home/minter/Exchange/Curious/ в нем нужно экранировать все /, т.е. должно получиться так \/home\/minter\/Exchange\/Curious\/.
А теперь следуем инструкции и получаем

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

sed -e 's/\/home\/minter\/Exchange\/Curious\//новое_слово/'
А так как нам нужно убрать не оставляя даже пробела то получается так

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

sed -e 's/\/home\/minter\/Exchange\/Curious\///'
.
В итоге имеем
Peek 2019-02-28 08-12.gif

Перейти к ответу ➙

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

Chocobo
Сообщения: 9070
Зарегистрирован: 27 авг 2016, 19:57
Решено: 197
Откуда: НН
Благодарил (а): 624 раза
Поблагодарили: 2581 раз

Удаление поворяющихся фраз через bash

Сообщение Chocobo » 27 фев 2019, 12:07

madesta, сам паттерн этого повторяющегося пути тебе известен, или его тоже надо определить?
Изображение
   
Изображение

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

Dja
Сообщения: 5467
Зарегистрирован: 27 авг 2016, 17:03
Решено: 22
Откуда: Voskresensk
Благодарил (а): 762 раза
Поблагодарили: 590 раз

Удаление поворяющихся фраз через bash

Сообщение Dja » 27 фев 2019, 12:13

Fslint Janitor хорош в этом плане. Ищет по содержимому. Т.е. если даже файлы названы по-разному все равно скажет что они одинаковы. (гуй).. /как решение данной задачи...

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

darkfenix
Сообщения: 4629
Зарегистрирован: 27 июн 2017, 10:36
Решено: 52
Откуда: Нижний Тагил
Благодарил (а): 272 раза
Поблагодарили: 877 раз

Удаление поворяющихся фраз через bash

Сообщение darkfenix » 27 фев 2019, 14:04

Dja, так ТСу же не файлу надо сравнивать. А, если я правильно понял, надо в каждом файле, в каждой строке удалить определенную часть строки, если таковая часть имеется.
Изображение

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

root
Сообщения: 942
Зарегистрирован: 16 фев 2017, 17:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 283 раза
Поблагодарили: 258 раз

Удаление поворяющихся фраз через bash

Сообщение root » 27 фев 2019, 15:04

madesta писал(а):
27 фев 2019, 11:36
Например:
/path/file.txt
/path/file.odt
path/folder1
path/folder1/file.avi
path/folder2
path/folder2/file.mp3
/path/folder2/file.ogg
Что конкретно вы хотите увидеть? Непонятно. Картину вроде этой:
/path/file.txt
/path/file.odt

path/folder1
path/folder1/file.avi
path/folder2
path/folder2/file.mp3
/path/folder2/file.ogg
?
Вы не готовы! :pc2:
Изображение

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

darkfenix
Сообщения: 4629
Зарегистрирован: 27 июн 2017, 10:36
Решено: 52
Откуда: Нижний Тагил
Благодарил (а): 272 раза
Поблагодарили: 877 раз

Удаление поворяющихся фраз через bash

Сообщение darkfenix » 27 фев 2019, 15:07

root, думается что хочет так
Было

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

/path/file.txt
/path/file.odt
path/folder1
path/folder1/file.avi
path/folder2
path/folder2/file.mp3
/path/folder2/file.ogg
Стало

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

/file.txt
/file.odt
/folder1
/folder1/file.avi
/folder2
/folder2/file.mp3
/folder2/file.ogg
Изображение

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

di_mok
Сообщения: 4829
Зарегистрирован: 27 авг 2016, 16:06
Решено: 30
Откуда: Арзамас
Благодарил (а): 1209 раз
Поблагодарили: 988 раз

Удаление поворяющихся фраз через bash

Сообщение di_mok » 27 фев 2019, 15:10

Когда мне понадобилось убрать из текстового файла повторяющиеся слова, выкрутился при помощи такой мудрёной конструкции

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

sed -r ':a; s/\b(alnum:+)\b(.*)\b\1\b/\1\2/g; ta; s/(, )+/, /g; s/, *$//' file_src.txt > file_dst.txt
Где:
file_src.txt - исходный файл
file_dst.txt - файл с результатом
Настоящая водка — это не пьянство, а ключ к своей совести, с нее-то и начинается настоящая мудрость. (c)
Изображение
Изображение

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

darkfenix
Сообщения: 4629
Зарегистрирован: 27 июн 2017, 10:36
Решено: 52
Откуда: Нижний Тагил
Благодарил (а): 272 раза
Поблагодарили: 877 раз

Удаление поворяющихся фраз через bash

Сообщение darkfenix » 27 фев 2019, 15:12

di_mok, в данном случаем может лишнее удалить
Изображение

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

di_mok
Сообщения: 4829
Зарегистрирован: 27 авг 2016, 16:06
Решено: 30
Откуда: Арзамас
Благодарил (а): 1209 раз
Поблагодарили: 988 раз

Удаление поворяющихся фраз через bash

Сообщение di_mok » 27 фев 2019, 15:20

darkfenix, вообще ни чего не удалил :-D Все строки разные же
Настоящая водка — это не пьянство, а ключ к своей совести, с нее-то и начинается настоящая мудрость. (c)
Изображение
Изображение

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

darkfenix
Сообщения: 4629
Зарегистрирован: 27 июн 2017, 10:36
Решено: 52
Откуда: Нижний Тагил
Благодарил (а): 272 раза
Поблагодарили: 877 раз

Удаление поворяющихся фраз через bash

Сообщение darkfenix » 27 фев 2019, 15:21

di_mok писал(а):
27 фев 2019, 15:20
вообще ни чего не удалил
:-D
Изображение

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

Автор темы
madesta
Сообщения: 196
Зарегистрирован: 11 июн 2017, 18:47
Решено: 6
Откуда: Минск, BY
Благодарил (а): 19 раз
Поблагодарили: 45 раз

Удаление поворяющихся фраз через bash

Сообщение madesta » 27 фев 2019, 16:25

darkfenix писал(а):
27 фев 2019, 15:07
root, думается что хочет так
Было

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

/path/file.txt
/path/file.odt
path/folder1
path/folder1/file.avi
path/folder2
path/folder2/file.mp3
/path/folder2/file.ogg
Стало

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

/file.txt
/file.odt
/folder1
/folder1/file.avi
/folder2
/folder2/file.mp3
/folder2/file.ogg
В принципе, почти верно. Только в окончательном варианте хотелка такая:

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

file.txt
file.odt
folder1
folder1/file.avi
folder2
folder2/file.mp3
folder2/file.ogg
Пока читаю руководство bash на http://www.opennet.ru/docs/RUS/bash_scripting_guide/
К сожалению, приемлемого рабочего варианта пока не нашёл.

P.S. В формулировке задания ошибочка, сорри. Везде должно быть /path/ А то в половине строк path/
Под /path/ следует понимать путь, например, /home/user/data/folder2/folder2-1/folder2-1-1
Файлы отчётов генерируются командой ls
Поспешил и может кого-нибудь рассмешил ...
Последний раз редактировалось пользователем 2 madesta; всего редактировалось раз: 27

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

darkfenix
Сообщения: 4629
Зарегистрирован: 27 июн 2017, 10:36
Решено: 52
Откуда: Нижний Тагил
Благодарил (а): 272 раза
Поблагодарили: 877 раз

Удаление поворяющихся фраз через bash

Сообщение darkfenix » 27 фев 2019, 16:27

madesta, тогда вернемся к вопросу
Chocobo писал(а):
27 фев 2019, 12:07
сам паттерн этого повторяющегося пути тебе известен, или его тоже надо определить?
Изображение

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

Автор темы
madesta
Сообщения: 196
Зарегистрирован: 11 июн 2017, 18:47
Решено: 6
Откуда: Минск, BY
Благодарил (а): 19 раз
Поблагодарили: 45 раз

Удаление поворяющихся фраз через bash

Сообщение madesta » 27 фев 2019, 16:34

Сорри, туплю. С возрастом мозги уже не те.
Насколько я понимаю, паттерн - это то, что надо удалить?
Полагал, что фразу, указывающую на путь, можно задать как переменную,
например del=/home/user/foler1/folder2/ и тогда уже оперировать $del

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

darkfenix
Сообщения: 4629
Зарегистрирован: 27 июн 2017, 10:36
Решено: 52
Откуда: Нижний Тагил
Благодарил (а): 272 раза
Поблагодарили: 877 раз

Удаление поворяющихся фраз через bash

Сообщение darkfenix » 27 фев 2019, 18:19

madesta, ну как-то так

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

#! /bin/bash

i=1
while read LINE; do
    q=$(echo $LINE | sed -e 's/\/path//')
    sed -i -e "$i d" 2.txt
    sed -i -e "$i i$q" 2.txt
    i=$(($i+1))
done < 2.txt
sed -i -e "$ a$q" 2.txt
Изображение

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

StarMAUGLI
Сообщения: 1533
Зарегистрирован: 10 сен 2016, 07:16
Решено: 15
Откуда: Москва
Благодарил (а): 628 раз
Поблагодарили: 177 раз

Удаление поворяющихся фраз через bash

Сообщение StarMAUGLI » 27 фев 2019, 18:46

https://itproffi.ru/komanda-sed-v-linux ... ie-zamena/
последний раздел про замену текста

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

Автор темы
madesta
Сообщения: 196
Зарегистрирован: 11 июн 2017, 18:47
Решено: 6
Откуда: Минск, BY
Благодарил (а): 19 раз
Поблагодарили: 45 раз

Удаление поворяющихся фраз через bash

Сообщение madesta » 27 фев 2019, 19:42

darkfenix писал(а):
27 фев 2019, 18:19
madesta, ну как-то так

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

#! /bin/bash

i=1
while read LINE; do
    q=$(echo $LINE | sed -e 's/\/path//')
    sed -i -e "$i d" 2.txt
    sed -i -e "$i i$q" 2.txt
    i=$(($i+1))
done < 2.txt
sed -i -e "$ a$q" 2.txt
Или я непроходимо туп, или что-то не срослось.
Пробую на файле /home/minter/.scripts/file.txt с содержанием:

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

/home/minter/Exchange/Curious/02.01
/home/minter/Exchange/Curious/02.01/Киллерфича Linux.pdf
/home/minter/Exchange/Curious/02.01/Иконки в Windows 98.pdf
/home/minter/Exchange/Curious/02.01/Windows 10-1.png
/home/minter/Exchange/Curious/02.01/Windows 10-3.png
/home/minter/Exchange/Curious/02.01/Bill Gates.pdf
/home/minter/Exchange/Curious/02.01/ФАС РФ.png
/home/minter/Exchange/Curious/02.01/Появилась информация о перспективном российском танке «Бурлан».mhtml
/home/minter/Exchange/Curious/02.01/Yandex-Mail.ru.png
/home/minter/Exchange/Curious/02.01/Windows 10-2.png
/home/minter/Exchange/Curious/02.01/Windows 7.png
/home/minter/Exchange/Curious/02.01/Macbook Pro.png
/home/minter/Exchange/Curious/02.01/Лица древних жителей Европы воссоздали по археологическим данным.mhtml
Выполняю:

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

i=1
while read LINE; do
    q=$(echo $LINE | sed -e 's/\/home/minter/Exchange/Curious//')
    sed -i -e "$i d" /home/minter/.scripts/file.txt
    sed -i -e "$i i$q" /home/minter/.scripts/file.txt
    i=$(($i+1))
done < /home/minter/.scripts/file.txt
sed -i -e "$ a$q" /home/minter/.scripts/file.txt
На выходе /home/minter/.scripts/file.txt

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

/home/minter/Exchange/Curious/02.01/Киллерфича Linux.pdf
/home/minter/Exchange/Curious/02.01/Windows 10-1.png
/home/minter/Exchange/Curious/02.01/Bill Gates.pdf
/home/minter/Exchange/Curious/02.01/Появилась информация о перспективном российском танке «Бурлан».mhtml
/home/minter/Exchange/Curious/02.01/Windows 10-2.png
/home/minter/Exchange/Curious/02.01/Macbook Pro.png
Выхлоп:

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

/home/minter/.scripts/file1.sh
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 4: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 4: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 4: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 17: неизвестный модификатор к `s'
sed: -e выражение #1, символ 4: ожидалась \ после «a», «c» или «i»
sed: -e выражение #1, символ 3: ожидалась \ после «a», «c» или «i»
minter@H-3:~$ 
А хотелось получить:

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

02.01
02.01/Киллерфича Linux.pdf
02.01/Иконки в Windows 98.pdf
02.01/Windows 10-1.png
02.01/Windows 10-3.png
02.01/Bill Gates.pdf
02.01/ФАС РФ.png
02.01/Появилась информация о перспективном российском танке «Бурлан».mhtml
02.01/Yandex-Mail.ru.png
02.01/Windows 10-2.png
02.01/Windows 7.png
02.01/Macbook Pro.png
02.01/Лица древних жителей Европы воссоздали по археологическим данным.mhtml
Последний раз редактировалось пользователем 1 madesta; всего редактировалось раз: 27

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

Автор темы
madesta
Сообщения: 196
Зарегистрирован: 11 июн 2017, 18:47
Решено: 6
Откуда: Минск, BY
Благодарил (а): 19 раз
Поблагодарили: 45 раз

Удаление поворяющихся фраз через bash

Сообщение madesta » 27 фев 2019, 19:56

StarMAUGLI писал(а):
27 фев 2019, 18:46
https://itproffi.ru/komanda-sed-v-linux ... ie-zamena/
последний раздел про замену текста
Если следовать инструкции 's/старое_слово/новое_слово/',
то получается:
sed 's//home/minter/Exchange/Curious///g' /home/minter/.scripts/file.txt

Выхлоп:
minter@H-3:~$ sed 's//home/minter/Exchange/Curious///g' /home/minter/.scripts/file.txt
sed: -e выражение #1, символ 11: неизвестный модификатор к `s'
minter@H-3:~$

После выполнения файл остался без изменений.

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

darkfenix
Сообщения: 4629
Зарегистрирован: 27 июн 2017, 10:36
Решено: 52
Откуда: Нижний Тагил
Благодарил (а): 272 раза
Поблагодарили: 877 раз

Удаление поворяющихся фраз через bash

Сообщение darkfenix » 28 фев 2019, 03:13

madesta писал(а):
27 фев 2019, 19:56
Если следовать инструкции 's/старое_слово/новое_слово/',
Тут нужно понять принцип.
Если там где "старое_слово" есть / его надо экранировать что и сделано в моем примере скрипта /\/path/ - \ перед /path.
В твоем случае есть путь /home/minter/Exchange/Curious/ в нем нужно экранировать все /, т.е. должно получиться так \/home\/minter\/Exchange\/Curious\/.
А теперь следуем инструкции и получаем

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

sed -e 's/\/home\/minter\/Exchange\/Curious\//новое_слово/'
А так как нам нужно убрать не оставляя даже пробела то получается так

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

sed -e 's/\/home\/minter\/Exchange\/Curious\///'
.
В итоге имеем
Peek 2019-02-28 08-12.gif
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Изображение

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

Автор темы
madesta
Сообщения: 196
Зарегистрирован: 11 июн 2017, 18:47
Решено: 6
Откуда: Минск, BY
Благодарил (а): 19 раз
Поблагодарили: 45 раз

Удаление поворяющихся фраз через bash

Сообщение madesta » 28 фев 2019, 19:57

darkfenix писал(а):
28 фев 2019, 03:13
в нем нужно экранировать все /
Жаль, что этого мне нигде из тех материалов, к которым обращался, вычитать не удалось.
Или читал не внимательно.

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

Chocobo
Сообщения: 9070
Зарегистрирован: 27 авг 2016, 19:57
Решено: 197
Откуда: НН
Благодарил (а): 624 раза
Поблагодарили: 2581 раз

Удаление поворяющихся фраз через bash

Сообщение Chocobo » 28 фев 2019, 20:54

darkfenix писал(а):
27 фев 2019, 18:19
ну как-то так
Давай попробуем укоротить и ограничиться функциями самого баша, без вызова утилит :smile:
http://mywiki.wooledge.org/BashFAQ/100# ... of_strings
BashFAQ писал(а):The ## means "remove the largest possible matching string from the beginning of the variable's contents".

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

#! /bin/bash
str=/home/minter/Exchange/Curious        # здесь укажем паттерн который надо выкинуть
while read LINE; do
echo "${LINE##*$str}"
done < listoflines.txt                  # входящий исходный файл
Изображение
   
Изображение

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