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

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 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 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
madesta
Сообщения: 2018
Зарегистрирован: 11 июн 2017, 21:47
Решено: 30
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 434 раза
Контактная информация:

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

#1

27 фев 2019, 14: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 попытаться изучить?

Решение rogoznik » 28 фев 2019, 06:13
madesta писал(а):
27 фев 2019, 22: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
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3010 раз
Контактная информация:

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

#2

27 фев 2019, 15:07

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

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

Dja
Сообщения: 6875
Зарегистрирован: 27 авг 2016, 20:03
Решено: 30
Откуда: Voskresensk
Благодарил (а): 1312 раз
Поблагодарили: 724 раза
Контактная информация:

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

#3

27 фев 2019, 15:13

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

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

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

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

#4

27 фев 2019, 17:04

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

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

root
Сообщения: 938
Зарегистрирован: 16 фев 2017, 20:03
Решено: 5
Откуда: г. Хабаровск
Благодарил (а): 268 раз
Поблагодарили: 262 раза
Контактная информация:

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

#5

27 фев 2019, 18:04

madesta писал(а):
27 фев 2019, 14: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:
Изображение

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

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

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

#6

27 фев 2019, 18: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
Сообщения: 5469
Зарегистрирован: 27 авг 2016, 19:06
Решено: 32
Откуда: Арзамас
Благодарил (а): 1593 раза
Поблагодарили: 1276 раз
Контактная информация:

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

#7

27 фев 2019, 18: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)
Изображение

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

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

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

#8

27 фев 2019, 18:12

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

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

di_mok
Сообщения: 5469
Зарегистрирован: 27 авг 2016, 19:06
Решено: 32
Откуда: Арзамас
Благодарил (а): 1593 раза
Поблагодарили: 1276 раз
Контактная информация:

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

#9

27 фев 2019, 18:20

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

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

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

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

#10

27 фев 2019, 18:21

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

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

Автор темы
madesta
Сообщения: 2018
Зарегистрирован: 11 июн 2017, 21:47
Решено: 30
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 434 раза
Контактная информация:

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

#11

27 фев 2019, 19:25

darkfenix писал(а):
27 фев 2019, 18: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

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

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

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

#12

27 фев 2019, 19:27

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

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

Автор темы
madesta
Сообщения: 2018
Зарегистрирован: 11 июн 2017, 21:47
Решено: 30
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 434 раза
Контактная информация:

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

#13

27 фев 2019, 19:34

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

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

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

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

#14

27 фев 2019, 21: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
Сообщения: 1650
Зарегистрирован: 10 сен 2016, 10:16
Решено: 19
Откуда: Москва
Благодарил (а): 697 раз
Поблагодарили: 187 раз
Контактная информация:

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

#15

27 фев 2019, 21:46

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

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

Автор темы
madesta
Сообщения: 2018
Зарегистрирован: 11 июн 2017, 21:47
Решено: 30
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 434 раза
Контактная информация:

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

#16

27 фев 2019, 22:42

darkfenix писал(а):
27 фев 2019, 21: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
Сообщения: 2018
Зарегистрирован: 11 июн 2017, 21:47
Решено: 30
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 434 раза
Контактная информация:

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

#17

27 фев 2019, 22:56

StarMAUGLI писал(а):
27 фев 2019, 21: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:~$

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

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

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

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

#18

28 фев 2019, 06:13

madesta писал(а):
27 фев 2019, 22: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
Сообщения: 2018
Зарегистрирован: 11 июн 2017, 21:47
Решено: 30
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 434 раза
Контактная информация:

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

#19

28 фев 2019, 22:57

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

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

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

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

#20

28 фев 2019, 23:54

darkfenix писал(а):
27 фев 2019, 21: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                  # входящий исходный файл
Изображение
   
Изображение

Закрыто

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

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

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