LINUX.ORG.RU

найти текст и вывести

 


0

1

«Мама очень долго мыла оконную раму» Подскажите как в bash вывести текст находящийся между фразами «мама очень» и «оконную раму» Чтоб был результат: «долго мыла» спасибо

$ echo "${S}"
Мама очень долго мыла оконную раму
$ S1=${S#Мама очень }
$ echo ${S1%оконную раму}
долго мыла
drBatty ★★ ()

echo Мама очень долго мыла оконную раму | sed 's/Мама очень//' | sed 's/оконную раму//'

anonymous ()
$ echo Мама очень долго мыла оконную раму |sed -r 's/мама очень (.+) оконную раму/\1/I'
долго мыла
anonymous ()

abs пункт «Извлечение подстроки»

$ str="Мама очень долго мыла оконную раму"
$ expr "$str" : 'Мама очень\(.*\)оконную раму'
 долго мыла 

anonymous ()

Безрукие, пилять.

A="Мама очень долго мыла оконную раму"
P="Мама очень(.*)оконную раму"

[[ $A =~ $P ]] && echo ${BASH_REMATCH[1]
anonymous ()

man cut

echo «Мама очень долго мыла оконную раму» | cut -d ' ' -f 3-4

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

sed -r 's/мама очень (.+) оконную раму/\1/I'

тут правильнее ставить i маленькую в конце ИМХО.

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

anonymous, возможно я не полностью сформулировал задачу. Вы предлагаете обрезать начало и конец и вывести середину. Но в фразе:
«ЕСТЬ ТЕКСТ ДО Мама очень долго мыла оконную раму ЕСТЬ ТЕКСТ ПОСЛЕ»
Надо вывести текст находящийся между фразами «мама очень» и «оконную раму» Чтоб был результат: «долго мыла» спасибо.

oldvoffka ()
Ответ на: комментарий от oldvoffka
$ A="bebebeb Мама очень долго мыла оконную раму asdasdasd"
$ P=".*Мама очень(.*)оконную раму.*"
$ [[ $A =~ $P ]] && echo ${BASH_REMATCH[1]}
долго мыла
anonymous ()
Ответ на: комментарий от anonymous

Спасибо еще раз
дошло до меня...

echo fasfdsdf Мама очень долго мыла оконную раму sagfsd | sed 's/.*Мама очень//' | sed 's/оконную раму.*//'

oldvoffka ()
Ответ на: комментарий от oldvoffka
$ text='ЕСТЬ ТЕКСТ ДО Мама очень долго мыла оконную раму ЕСТЬ ТЕКСТ ПОСЛЕ'
$ echo $text |sed -rn '/.*Мама очень (.+) оконную раму.*/{s//\1/;p}'
долго мыла
anonymous ()

Хммм... замерил командой time обе конструкции вот что вышло для моего случая:

... | sed -rn '/.*Мама очень (.+) оконную раму.*/{s//\1/;p}'
real 0m3.016s
... | sed 's/.*Мама очень//' | sed 's/оконную раму.*//'
real 0m0.116s

Еще раз всем спасибо.

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

... | sed 's/.*Мама очень//' | sed 's/оконную раму.*//'

Это не корректная команда, так как среагирует на строки содержащие только один из шаблонов «Мама очень» или «оконную раму». А по условию оба шаблона должны быть в строке.

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

И почему ты упорно игнорируешь вариант [[ $A =~ $P ]] && echo ${BASH_REMATCH[1]} ???

Он в десять раз быстрее чем | sed 's/.*Мама очень//' | sed 's/оконную раму.*//'

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

замерил командой time обе конструкции вот что вышло для моего случая:

неправильно мерил. Первая команда должна выполняться быстрее(или также, если получится в два потока развернуть).

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

sed 's/.*Мама очень//' | sed 's/оконную раму.*//'

Это не корректная команда

sed -n 's/.*Мама очень//;T;s/оконную раму.*//p' но два поиска всё равно дольше одного.

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

Он в десять раз быстрее чем

он в десять раз медленнее, если не мучить конвейеры, а сделать всё одной командой sed. Bash вообще очень тормозной, особенно всякие башизмы типа =~.

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

если не мучить конвейеры, а сделать всё одной командой sed

если, если, ...

А если форкать sed на каждую строку то .... Вот тебе еще «если»

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

Кроме того, в рамках вопроса ТС просил bash, а это значит bash, а не coreutils и иже с ними (хотя я понимаю, что ТС просто некомпетентен в терминологии)

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

А если форкать sed на каждую строку то .... Вот тебе еще «если»

вот я и говорю, что не нужно ничего форкать, тогда быстро и просто получается.

Ну а башизмы и особенно массивы тормозят.

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

Ребята, спасибо вам. anonymous, в точку. такая

[[ $A =~ $P ]] && echo ${BASH_REMATCH[1]} 
конструкция у меня пока не укладывается в голове. Я только пару недель назад узнал что такое |
и тольк

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

Я только пару недель назад узнал что такое |

а сегодня попытайтесь понять, что бездумное применение | ведёт к жутким тормозам. Это конвейер, который запускает несколько _одновременных_ процессов. И это всегда плохо, если можно сделать одним.

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

И да, sed это sed, а не coreutils.

и да, «и иже с ними» ты не заметил

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.