Как установить переменную, равную определенной структуре подстроки в Bash?

Это зависит от того, предполагается ли запуск этой программы с терминала. Если да, я не думаю, что вы можете сделать в bash; вы должны использовать что-то вроде expect. Пример:

обертка.ожидание:

puts "<<< pid=[pid] >>>"
spawn {*}$argv
trap {send "quit\n"} SIGTERM
interact

пример с bc:

expect wrapper.expect bc -q

<<< pid=4771 >>>
spawn bc -q

kill 4771из другого окна заставит expectотправить строку quitна bc. Обратите внимание, что 4771— это pid процесса expect, а не подпроцесса bc.

Другим вариантом может быть использование TIOCSTIioctl для вставки строки quitв текущий терминал; но опять же, вы не сможете сделать это из оболочки; вам по-прежнему нужна небольшая программа на C (или perl, python и т. д. )только для вызова ioctl()(, а TIOCSTIуже выпотрошен в таких системах, как OpenBSD ).

0
30.04.2020, 10:21
3 ответа

Если вы хотите, чтобы 5-я/-строка с разделителями в строке:

$ cut -d '/' -f 5 <<<'http://website.com/class/cse111/homework2/test.html'
cse111

Если вам нужна строка (s ), начинающаяся с cseи заканчивающаяся/:

$ grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html'
cse111

Затем используйте любой из них в подстановке команд, например.

num=$( grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html' )

Обратите внимание, что [^cse]соответствует любому одиночному символу , который не является c, sили e, и что .соответствует любому одиночному символу.

0
19.03.2021, 02:05

Вы также можете решить эту проблему с помощьюsed

coursenum=$(sed 's/^.*\(cse[^/]*\)/.*$/\1/' <<< "${website_url}")

или с использованием подстановки параметров bash

coursenum=cse${website_url#*cse}
coursenum=${coursenum%%\/}
0
19.03.2021, 02:05

Если то, что вы показали нам как команду присваивания, буквально соответствует вашему сценарию, есть две проблемы.

  • Во-первых, у вас неправильное регулярное выражение для вашей задачи. Ваше выражение будет искать строку, которая , а не , начинается либо с c, s, либо e, (, это то, что [^cse]на самом деле делает )и следует на три произвольных символа(...)после этого первого символа, так что в любом случае получится только четыре символа.

  • Во-вторых, вам не хватает аргумента grep.

Если вы используете bashи ваша исходная строка хранится в переменной $courseurl, вы можете использовать

coursenum="$(grep -o 'cse[^/]\{3,5\}' <<< "$courseurl")"

В других оболочках, которые не поддерживают строки «здесь -», используйте

coursenum="$(echo "$courseurl" | grep -o 'cse[^/]\{3,5\}')"

Кроме того, комментарий @ArkadiuszDrabcyz и решение @Devon указывают правильное направление, если номер курса всегда является третьим компонентом URL-адреса курса.

В общем, если вы новичок в регулярных выражениях, я бы рекомендовал обратить внимание на такие инструменты, как RegExr или RegEx101 , которые позволяют тестировать регулярные выражения и смотреть, делают ли они то, что нужно. ты хочешь.

1
19.03.2021, 02:05

Теги

Похожие вопросы