Извлечение группы из регулярных выражений в сценарии оболочки с использованием grep
Я хочу извлечь выходные данные команды, выполняемой через сценарий оболочки, в переменную, но я не могу это сделать. я использую grep
Команда для того же. Пожалуйста, помогите мне получить желаемый результат в переменной.
x=$(pwd)
pw=$(grep '\(.*\)/bin' $x)
echo "extracted is:"
echo $pw
Выход из pwd
команда /opt/abc/bin/
и я хочу только /root/abc
Часть этого. Заранее спасибо.
4 ответа
Использование dirname
чтобы получить путь, а не последний сегмент пути.
Все, что вы делаете, можно сделать за один раз. echo
:
echo "${PWD%/*}"
$PWD
переменная представляет текущий каталог и %/*
удаляет последний /
и часть за последней /
,
Для вашего случая это выдаст: /root/abc
Ты можешь использовать:
x=$(pwd)
pw=`dirname $x`
echo $pw
Или просто:
pw=`dirname $(pwd)`
echo $pw
Второй (и любой последующий) аргумент grep
это имя файла для поиска, а не строка для сопоставления.
Более того, grep
печатает соответствующую строку или (с -o
) совпадающая строка, а не все скобки. Для этого вам нужен другой инструмент.
Минимальное исправление вашего кода будет
x=$(pwd)
pw=$(printf '%s\n' "$x" | sed 's%\(.*\)/bin.*%\1%')
(Если вы заботитесь только о Bash, а не о других оболочках, вы могли бы сделать sed ... <<<"$x"
без явного канала; синтаксис также несколько более удовлетворительный.)
Но, конечно, в оболочку встроены базовые функции для работы со строками.
pw=${x%/bin*}