На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
kotnaton
Сообщения: 234
Сообщение
kotnaton » 04.05.2014 13:29
Собственно, что здесь не так ?
Код: Выделить всё
sed '/#EXTINF.*$^udp:\/\/@239.64.64.253:1234$' iptv.m3u
Пробую так же и так:
Код: Выделить всё
sed 's/#EXTINF.*$^.*239.64.64.253:1234//g' iptv.m3u
собственно надо найти и удалить из m3u всегда по 2 строки:
Код: Выделить всё
#EXTINF:0 tvg-name="случайный текст TV" tvg-shift="0", случайный текст
udp://@239.64.64.253:1234
бывает же такое ???
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo
Сообщение
/dev/random » 04.05.2014 13:40
"^" и "$" предназначены для привязки начала или конца выражения к, соответственно, началу или концу обрабатываемой строки. В середине выражения они работать не будут.
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 04.05.2014 14:13
Код: Выделить всё
sed '/^#EXTINF/{N;/@239.64.64.253:1234$/d}'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
kotnaton
Сообщения: 234
Сообщение
kotnaton » 05.05.2014 21:17
Спасибо ! А 'N:' это что за оператор ? И будет ли верно 'N;N;N;' , допустим , для такого же действия на 4 строчки вверх ?
Если можно еще похожий вопрос, в интернете решения не нашел: как удалить (включая) весь текст между /regexp1/ и /regexp2/ содержащий строку regexp3 ? Например, <title> и </title> где есть слово "радио" ?
Нашел такой конструктор:
Код: Выделить всё
sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip'
Понятно, что
/\1 это какая-то подстановка, но откуда она берется ???
бывает же такое ???
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 05.05.2014 22:14
kotnaton писал(а): ↑ 05.05.2014 21:17
Понятно, что /\1 это какая-то подстановка, но откуда она берется ???
из круглых скобок ().
см учебник в моей подписи
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 05.05.2014 22:19
/dev/random писал(а): ↑ 04.05.2014 13:40
"^" и "$" предназначены для привязки начала или конца выражения к, соответственно, началу или концу обрабатываемой строки. В середине выражения они работать не будут.
будут:
$
$ echo "line1
line2
line3" | sed 'N;N;s/^/%&%/g'
%%line1
line2
line3
$ echo "line1
line2
line3" | sed 'N;N;s/^/%&%/mg'
%%line1
%%line2
%%line3
в первой команде не работает, а во второй -- работает (:
если надо, что-бы и во второй НЕ работало в середине, тогда так:
$
$ echo "line1
line2
line3" | sed 'N;N;s/\`/%&%/mg'
%%line1
line2
line3
PS: я имел ввиду "в середине строки ^ (не)работает". В середине
выражения работать -- работает, но смысла не имеет.
kotnaton
Сообщения: 234
Сообщение
kotnaton » 10.07.2018 12:31
Вернусь к теме. Обнаружил, что каталогизатор для CD, написанный для себя пару лет назад, перестал работать, оказалось что Udiskctl info -b /dev/sr0 выдаёт теперь две строки Size:
Код: Выделить всё
/org/freedesktop/UDisks2/block_devices/sr0:
org.freedesktop.UDisks2.Block:
Configuration: []
CryptoBackingDevice: '/'
Device: /dev/sr0
DeviceNumber: 2816
Drive: '/org/freedesktop/UDisks2/drives/HL_DT_ST_DVDRAM
HintAuto: true
HintIconName:
HintIgnore: false
HintName:
HintPartitionable: false
HintSymbolicIconName:
HintSystem: false
Id: by-uuid-2018-03-10-11-41-22-00
IdLabel: Debian 9.4.0 amd64 1
IdType: iso9660
IdUUID: 2018-03-10-11-41-22-00
IdUsage: filesystem
IdVersion: Joliet Extension
MDRaid: '/'
MDRaidMember: '/'
PreferredDevice: /dev/sr0
ReadOnly: true
Size: 3977379840
Symlinks: /dev/cdrom
/dev/disk/by-id/ata-HL-DT-ST_DVDRAM
/dev/disk/by-id/wwn-0x5001480000000000
/dev/disk/by-label/Debian\x209.4.0\x20amd64\x201
/dev/disk/by-path/pci-0000:00:1f.2-ata-2
/dev/disk/by-uuid/2018-03-10-11-41-22-00
UserspaceMountOptions:
org.freedesktop.UDisks2.Filesystem:
MountPoints:
Size: 0
Собственно как оставить Size из блока org.freedesktop.UDisks2.Block, и игнорировать всё остальное; попытка сделать так:
ничего не меняет, строка же
приводит к дублированию всех строк, а
приводит возврату трёх строк, включая и паразитную Size из блока щrg.freedesktop.UDisks2.Filesystem::(
Последний раз редактировалось kotnaton 10.07.2018 12:38, всего редактировалось 1 раз.
бывает же такое ???
Vascom
Сообщения: 1699
ОС: Fedora 32
Сообщение
Vascom » 10.07.2018 12:37
Покажи свой скрипт.
kotnaton
Сообщения: 234
Сообщение
kotnaton » 10.07.2018 12:42
Ну я там кое чего поломал, но... вот:
Код: Выделить всё
#!/bin/bash
set -x
pause_cd() {
eject -t
i=0
until [[ $insert_cd -ne 0 ]]
do
insert_cd=$( udisksctl info -b /dev/sr0 | grep Size: | awk '{ print $2 }' )
sleep 1
i=$((i+1))
echo -n $i" "
done
echo
}
create_tree() {
f=`df | grep sr0 | awk -F"% " '{ print $2 }'`
vr=$( ls -lhGg --time-style="long-iso" $( dirname $( df | grep sr0 | awk -F"% " ' { print $2 }' )) | grep $( basename $( df | grep sr0 | awk -F"% " ' { print $2 }' )) | awk '{ print $4,$5 }' )
echo -e "Новая метка тома: $nnnn" | tee tmp
echo -e "Старая метка тома: $old" | tee -a tmp
echo -e "Время создания: $vr \n\n" | tee -a tmp
cat tmp
razmer=$( du -hd0 "$f" )
echo "[ "$razmer | sed 's/ \//\] \//g' >> tmp
tree -h "$f" | sed '1d' >> tmp
if [[ "$arhivate" == "yes" ]]
then
find "$f" -name "*.tar.*" -exec printf '\n%.0s' {1..3} >> tmp \; -exec echo "{}" >> tmp \; -exec tar tvf "{}" >> tmp \;
find "$f" -regex '.*\.\(zip\|rar\|7z\|arj\|cab\|chm\|wv\)' -exec printf '\n%.0s' {1..3} >> tmp \; -exec 7z l {} >> tmp \; # -exec sed -i '/^7-Zip/,/^--$/d' tmp \;
fi
sed -r -i '/7-Zip/,/^--$/d' tmp
not_rewrite
mv tmp "`echo $nnnn`.list"
if [[ $nl == "all" ]] ; then cat "$nnnn.list" ; fi
}
not_rewrite() {
rewr=0
tname="$nnnn"
while [[ -f $nnnn.list ]]
do
rewr=$(($rewr+1))
tname=$tname"___"$rewr
if [[ ! -f $tname.list ]]
then
nnnn=$tname
else
tname=$nnnn
fi
done
}
rename_list() {
echo "Имя списка: $nnnn.list"
if [[ -z "$na" ]]
then
echo "Введите новое, или оставьте поле пустым:" ;
read r ;
else
validate=`echo $nnnn | tr '[:upper:]' '[:lower:]'`
echo "Validate name: $validate"
if [[ $validate == *k3b* ]]
then
echo "Введите иное или подтвердите, нажав Enter:" ;
read r ;
fi
fi
if [ "$r" ]
then
nnnn="$r"
not_rewrite
echo "Список переименован..."
echo "Было: $old.list Вы ввели: $r, записалось $nnnn.list"
mv "$old.list" "$nnnn.list"
else
echo "Saved as $nnnn.list"
fi
}
eject_disc() {
udevil umount /dev/sr0
eject
echo "мы дошли до eject"
}
ME=`basename $0`
print_help() {
cat <<EOF
Дополнительные опции
Использование: $ME [-t|-u][-s] | [-d][-a][-l]
Параметры:
-t Опция ISO9660 (может понадобиться для некоторых дисков)
-u Опция UDF (может понадобиться для некоторых дисков)
-s Монтирование в директорию /media/iso (нужен для томов с кириллицей и пробелами в названии. Права на директорию 0755 для Users ).
-d По-умолчанию. Без опций.
-a По-умолчанию yes на вопросы.
-l Выводить на экран содержимое готового .list
-r Парсить архивы. Поддержка rar,7z, и, под вопросом, zip - в будущих версиях
-h Справка
-v Версия программы
EOF
exit 0
}
boolean="0"
while getopts "tusdlahrv" "opt" ;
do
case "$opt" in
t) nt="-t iso9660"
echo "Опция: -t iso9660"
pause_cd
boolean="1" ;;
u) nt="-t udf"
echo "Опция: -t udf"
pause_cd
boolean="1"
;;
s) nm="/media/iso"
echo "Монтируем в точку $nm"
pause_cd
boolean="1" ;;
h) print_help
;;
d) echo "По умолчанию. Без опций"
pause_cd
boolean="1"
;;
a) echo "Вопросов не будет..."
na="all"
boolean="1"
;;
l) echo "По завершении увидите готовый список"
nl="all"
boolean="1"
;;
r) echo "Будем парсить архивы: tar,rar,7z,chm,arj,zip"
arhivate="yes"
boolean="1" ;;
v) cat <<-EOF
********* Каталогизатор v2.01.3 *********
************** for udisks2 **************
EOF
exit 0
;;
*) print_help
;;
esac
done
if [[ $boolean == "0" ]] ; then print_help ; fi
if [[ ! $( mount | grep sr0 ) ]]
then
echo "Монтируем... $nt $nm" ;
udevil mount $nt /dev/sr0 $nm ;
fi
nnnn="`udisksctl info -b /dev/sr0 | grep IdLabel: | awk -F "IdLabel:" '{ print $2 }' | sed 's/ .//g' | sed 's/^-//g'`"
if [[ -z "$nnnn" ]]
then
nnnn=`echo $( isoinfo -i /dev/sr0 -d | sed '/Volume id: /!d' | sed 's/Volume id: //g')`
echo "isoinfo -i"
fi
old=$nnnn
create_tree
if [[ "$na" == "all" ]]
then
eject_disc ;
rename_list ;
else
echo "Ваш диск был вставлен, вынуть ?"
read "r"
case "$r" in
y|Y|д|Д|""|н|Н) echo "Вынимаем..." ;
eject_disc ;
rename_list ;
;;
n|N|т|Т) echo "Выходим..." ;
rename_list ;
;;
esac
fi
exit 0
Собственно, проблема в самом начале:
Код: Выделить всё
insert_cd=$( udisksctl info -b /dev/sr0 | grep Size: | awk '{ print $2 }'
Теперь возрващаются две строки Size, что приводит к ошибке "0: синтаксическая ошибка в выражении (неверный маркер «0»)"
Последний раз редактировалось kotnaton 10.07.2018 12:47, всего редактировалось 1 раз.
бывает же такое ???
Vascom
Сообщения: 1699
ОС: Fedora 32
Сообщение
Vascom » 10.07.2018 12:46
Вместо
Код: Выделить всё
insert_cd=$( udisksctl info -b /dev/sr0 | grep Size: | awk '{ print $2 }' )
сделай
Код: Выделить всё
insert_cd=$( udisksctl info -b /dev/sr0 | grep -m 1 Size: | awk '{ print $2 }' )
kotnaton
Сообщения: 234
Сообщение
kotnaton » 10.07.2018 12:56
Собственно, это первое чего хотелось сделать, но больше хочется выхлоп привязать именно к блоку /org/freedesktop/UDisks2/block_devices/sr0, собственно, вопрос именно про то как это парсить
бывает же такое ???
Vascom
Сообщения: 1699
ОС: Fedora 32
Сообщение
Vascom » 10.07.2018 12:58
А чем не устраивает? Всегда же будет работать.
Bizdelnick
Модератор
Сообщения: 21242
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 10.07.2018 13:15
kotnaton писал(а): ↑ 10.07.2018 12:31
как оставить Size из блока org.freedesktop.UDisks2.Block, и игнорировать всё остальное
Плохая идея делать это с помощью sed.
Код: Выделить всё
#!/bin/sed -nrf
/^ org\.freedesktop\.UDisks2\.Block:$/ {
:loop
n
/^ [^[:space:]]/q
/^ Size:[[:space:]]*[[:digit:]]*/p
b loop
}
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
kotnaton
Сообщения: 234
Сообщение
kotnaton » 25.07.2018 07:20
Vascom писал: ↑ 10.07.2018 12:58
А чем не устраивает?
В конце-концов, по вашему и сделал
Bizdelnick писал: ↑ 10.07.2018 13:15
Плохая идея делать это с помощью sed.
Код: Выделить всё
sed -nrf
/^ org\.freedesktop\.UDisks2\.Block:$/ {
:loop
n
/^ [^[:space:]]/q
/^ Size:[[:space:]]*[[:digit:]]*/p
b loop
}
Спасибо за интересный пример
А, собственно, без sed как ещё можно ?
бывает же такое ???
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Сообщение
serzh-z » 25.07.2018 16:06
Я бы это сделал через D-Bus напрямую в обход клиента UDisks2.
Если система с systemd, то можно использовать клиент sd-bus:
Shell
busctl get-property org.freedesktop.UDisks2 /org/freedesktop/UDisks2/block_devices/sr0 org.freedesktop.UDisks2.Block Size | awk '{ print $2 }'
Либо с помощью Python и pydbus:
Shell
python -c "import pydbus; print pydbus.SystemBus().get('.UDisks2', 'block_devices/sr0')['org.freedesktop.UDisks2.Block'].Size"
kotnaton
Сообщения: 234
Сообщение
kotnaton » 05.10.2018 16:44
Не стану открывать новую, продолжу старую:
Нужно в выводе команды ls итоговый размер директории переместить в строку к пути, и вместо:
Получить что-то типа:
Само собой напрашивающееся ничего возвращает...
Код: Выделить всё
sed -ne 'N;x;s/итого \([0-9KMGT]\)/\{N;p}\1/g'
бывает же такое ???
Bizdelnick
Модератор
Сообщения: 21242
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 05.10.2018 16:54
sed -r '/:$/{N;s/(.*)\n(.*)/\2: \1/}'
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик