LINUX.ORG.RU

sed замена до первого вхождения

 ,


0

1

https://gist.github.com/ignatenkobrain/53a64e30bdaadec34e0a#file-gistfile1-sh...

_dnf_help_command()
{
    if perl -e "exit 0 if (successful); exit 1"; then
        eval "$2='$( dnf help $1 | perl -ne "next unless /^$1/; s|.*?\[(.*?)\].*|\1|g; s/\|/ /g; print; exit" )'"
    else
        eval "$2='$( dnf help $1 | grep -E "^$1" | sed -e "s/|/ /g" -e "s/^$1 \[//g" -e "s/\].*$//g" )'"
    fi
}
В sed используется удаление до первого [ и после первого ], но это разделено на 2 команды. Пробовал так:
asd="group" && echo -e "abc\n$asd [one two three] [GRP]" | grep -E "^$asd" | sed -e "s/^$asd \[\(.*\)\].*$/\1/g"
Ожидаю получить «one two three», но не получаю.

С перлом все ок, там юзал "?" для нежадного поиска.

★★★
Ответ на: комментарий от anonymous

я вот обычно из awk запускаю clang++ -lQtCore -lQtGui ... на то есть причины

anonymous
()
Ответ на: комментарий от anonymous

Не уверен, что подобная конструкция будет быстрее

echo ${${$( dnf help $1 )%*[}##].*}
Хотя надо попробовать.

powerguy ★★★
() автор топика
Ответ на: комментарий от powerguy

Хотя бы для моего случая. Что-то вроде вместо .* использовать [^\]]+

powerguy ★★★
() автор топика

Объясни подробнее что ты пытаешься сделать. Между [] может быть ]? Если нет, то подойдет

asd="group" && echo -e "abc\n$asd [one two three] [GRP]" | sed -n -r "s/^$asd \[([^]]+)\].*$/\1/p"

unclear
()
Ответ на: комментарий от powerguy

Я практически не умею в sed, perl и awk :(.

Но скрипт мне ваш совершенно не нравится. Если есть perl то зачем страдать в sed? Можно попытаться исправить твой регексп по заветам из http://stackoverflow.com/questions/1103149/non-greedy-regex-matching-in-sed, но зачем? Воткни perl вместо sed и будет праздник.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Воткни perl вместо sed и будет праздник

Лорчую.

anonymous
()
Ответ на: комментарий от true_admin

Perl искаропки нет в федоре, а делать доп зависимость не хорошо.

powerguy ★★★
() автор топика
Ответ на: комментарий от powerguy

Да простят меня любители перла... и просто адекватные люди... Ща сделаю. Возможно (скорее всего), будет страшновато и длинновато...

true_admin ★★★★★
()
Ответ на: комментарий от powerguy

Держи

asd="group" && echo -e "abc\n$asd [one two three] [GRP]" | \
python3 -c "import sys,re; \
  [[print(m)
      for m in re.findall('${asd} \[(.*?)\]', line)]
        for line in sys.stdin]"

Если в федоре нет третьего питона из коробки то можно заменить print() на sys.stdout.write() или сделать from __future__ import print_statement.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

а как туда ещё зафигачить line.replace(«|», " ")?

powerguy ★★★
() автор топика
Ответ на: комментарий от true_admin

это bash-completion. после нескольких тестов сравнения скорости работы оставил такую функцию. работает быстрее ~ на 20ms по сравнению с sed/perl bash

_dnf_help_command()
{
    local cmd=$( dnf help $1 | grep -E "^$1" | tr "|" " " )
    cmd=${cmd#*[} && cmd=${cmd%%]*}
    eval "$2='$cmd'"
}
А вообще вот коллекция решений. perl
_dnf_help_command()
{
    eval "$2='$( dnf help $1 | perl -ne "next unless /^$1/; s|.*?\[(.*?)\].*|\1|g; s/\|/ /g; print; exit" )'"
}
sed
_dnf_help_command()
{
    eval "$2='$( dnf help $1 | grep -E "^$1" | sed -e "s/|/ /g" -e "s/^$1 \[//g" -e "s/\].*$//g" )'"
}
python _dnf_help_command() { eval «$2='$( dnf help $1 | python -c „import sys,re; [[sys.stdout.write(m.replace('|', ' ')) for m in re.findall('${1} \[(.*?)\]', line)] for line in sys.stdin]“ )'» }

powerguy ★★★
() автор топика
Ответ на: комментарий от powerguy

Может не надо это в виде однострочника пихать? А то у меня глаза ломаются каждый раз когда такое вижу. Имхо, скрипты должны быть максимально понятными. Больше 90% проектов не получают мои патчи потому что я не могу их написать. У меня просто нет столько лишнего времени чтобы чужую лапшу разгребать.

А уж глядя на $1 и $2 плакать хочется. Вот ты когда пишешь код ты же не называешь функции func1(arg1, arg2). Всему надо давать осмысленные имена.

PS c line.replace() я вижу ты разобрался.

true_admin ★★★★★
()
Ответ на: комментарий от powerguy

Я понимаю. Поэтому делают как-то так:

func() {
  arg1=$1
  arg2=$2
}
true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.