Страница 1 из 2
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 14:36
madesta
Имеются файлы отчётов, в которых присутствует повторяющихся путь и далее имена файлов и/или папок.
Например:
/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 попытаться изучить?
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 15:07
Chocobo
madesta, сам паттерн этого повторяющегося пути тебе известен, или его тоже надо определить?
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 15:13
Dja
Fslint Janitor хорош в этом плане. Ищет по содержимому. Т.е. если даже файлы названы по-разному все равно скажет что они одинаковы. (гуй).. /как решение данной задачи...
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 17:04
rogoznik
Dja, так ТСу же не файлу надо сравнивать. А, если я правильно понял, надо в каждом файле, в каждой строке удалить определенную часть строки, если таковая часть имеется.
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 18:04
root
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
?
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 18:07
rogoznik
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
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 18:10
di_mok
Когда мне понадобилось убрать из текстового файла повторяющиеся слова, выкрутился при помощи такой мудрёной конструкции
Код: Выделить всё
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 - файл с результатом
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 18:12
rogoznik
di_mok, в данном случаем может лишнее удалить
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 18:20
di_mok
darkfenix, вообще ни чего не удалил

Все строки разные же
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 18:21
rogoznik
di_mok писал(а): ↑27 фев 2019, 18:20
вообще ни чего не удалил

Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 19:25
madesta
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
Поспешил и может кого-нибудь рассмешил ...
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 19:27
rogoznik
madesta, тогда вернемся к вопросу
Chocobo писал(а): ↑27 фев 2019, 15:07
сам паттерн этого повторяющегося пути тебе известен, или его тоже надо определить?
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 19:34
madesta
Сорри, туплю. С возрастом мозги уже не те.
Насколько я понимаю, паттерн - это то, что надо удалить?
Полагал, что фразу, указывающую на путь, можно задать как переменную,
например del=/home/user/foler1/folder2/ и тогда уже оперировать $del
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 21:19
rogoznik
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
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 21:46
StarMAUGLI
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 22:42
madesta
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
Удаление поворяющихся фраз через bash
Добавлено: 27 фев 2019, 22:56
madesta
Если следовать инструкции '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:~$
После выполнения файл остался без изменений.
Удаление поворяющихся фраз через bash
Добавлено: 28 фев 2019, 06:13
rogoznik
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\///'
.
В итоге имеем
Удаление поворяющихся фраз через bash
Добавлено: 28 фев 2019, 22:57
madesta
darkfenix писал(а): ↑28 фев 2019, 06:13
в нем нужно экранировать все /
Жаль, что этого мне нигде из тех материалов, к которым обращался, вычитать не удалось.
Или читал не внимательно.
Удаление поворяющихся фраз через bash
Добавлено: 28 фев 2019, 23:54
Chocobo
darkfenix писал(а): ↑27 фев 2019, 21:19
ну как-то так
Давай попробуем укоротить и ограничиться функциями самого баша, без вызова утилит
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 # входящий исходный файл