На основе Как эмулировать подстановку процессов в Dash?(спасибо αғснιη ! ), с поправкой наdash
:
( cmd1 | ( cmd2 | ( diff /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
Использованиеsed
sed -n "s/hostip=\([^ ]*.*\)/\1/p" config.txt
Но если ваш config.txt содержит пробелы в объявлении, например hostip = 192.168.1.2
, используйте:
sed -n "s/hostip *= *\([^ ]*.*\)/\1/p" config.txt
Наконец, чтобы упростить жизнь, создайте функцию или скрипт-оболочку:
get_value() {
sed -n "s/$1 *= *\([^ ]*.*\)/\1/p" $2
}
get_value hostip config.txt
# prints 192.168.1.2
get_value pname config.txt
# prints My Office
hostip=$(get_value hostip config.txt)
Использование Raku (, ранее известного как Perl6)
~$ raku -ne 'put $/ if m/ <?after hostip\= > \" <([\d**1..3 \.]**3 \d**1..3)> \" /;' config1.txt
192.168.1.2
Флаги командной строки -ne
сообщают Раку, что нужно проверять строку ввода -по строке -. В приведенном выше коде используется положительное нулевое -утверждение ширины просмотра, записанное <?after … >
. Регулярное выражение ищет совпадение из четырех наборов цифр, каждый из которых имеет длину от 1 -до -3 цифр, разделенных точкой. Идиома <( … )>
говорит Raku отбрасывать каждое внешнее совпадение и загружать внутреннее совпадение в переменную соответствия $/
, которая возвращается.
ХТН.