Страница 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, вообще ни чего не удалил :-D Все строки разные же

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

Добавлено: 27 фев 2019, 18:21
rogoznik
di_mok писал(а):
27 фев 2019, 18:20
вообще ни чего не удалил
:-D

Удаление поворяющихся фраз через 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
https://itproffi.ru/komanda-sed-v-linux ... ie-zamena/
последний раздел про замену текста

Удаление поворяющихся фраз через 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
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:~$

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

Удаление поворяющихся фраз через 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\///'
.
В итоге имеем
Peek 2019-02-28 08-12.gif

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

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

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

Добавлено: 28 фев 2019, 23:54
Chocobo
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                  # входящий исходный файл