Это зависит от того, предполагается ли запуск этой программы с терминала. Если да, я не думаю, что вы можете сделать в 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
.
Другим вариантом может быть использование TIOCSTI
ioctl для вставки строки quit
в текущий терминал; но опять же, вы не сможете сделать это из оболочки; вам по-прежнему нужна небольшая программа на C (или perl, python и т. д. )только для вызова ioctl()
(, а TIOCSTI
уже выпотрошен в таких системах, как OpenBSD ).
Если вы хотите, чтобы 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
, и что .
соответствует любому одиночному символу.
Вы также можете решить эту проблему с помощьюsed
coursenum=$(sed 's/^.*\(cse[^/]*\)/.*$/\1/' <<< "${website_url}")
или с использованием подстановки параметров bash
coursenum=cse${website_url#*cse}
coursenum=${coursenum%%\/}
Если то, что вы показали нам как команду присваивания, буквально соответствует вашему сценарию, есть две проблемы.
Во-первых, у вас неправильное регулярное выражение для вашей задачи. Ваше выражение будет искать строку, которая , а не , начинается либо с 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 , которые позволяют тестировать регулярные выражения и смотреть, делают ли они то, что нужно. ты хочешь.