Извлечение группы из регулярных выражений в сценарии оболочки с использованием 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*}
Другие вопросы по тегам