2015-10-08 20 views
0

Я хочу извлечь результат выполнения команды через скрипт оболочки в переменной, но я не могу это сделать. Для этого я использую команду grep. Пожалуйста, помогите мне получить желаемый результат в переменной.Извлечение группы из regex в скрипте оболочки с помощью grep

x=$(pwd) 
pw=$(grep '\(.*\)/bin' $x) 
echo "extracted is:" 
echo $pw 

Выход команды pwd является /opt/abc/bin/ и я хочу только /root/abc часть. Заранее спасибо.

ответ

1

Используйте dirname, чтобы получить путь, а не последний отрезок пути.

+0

Я сделал модификацию, последняя часть бен не файл, а каталог, так что ошибка говоря '/ Opt/а/бен: это directory' , – user3379410

+1

он все равно должен работать. – sashang

+0

Ошибка, которую вы видите, из команды 'grep', которую вы используете неправильно. grep ожидает, что файл не является каталогом. – sashang

1

Вы можете использовать:

x=$(pwd) 
pw=`dirname $x` 
echo $pw 

Или просто:

pw=`dirname $(pwd)` 
echo $pw 
+0

Отсутствие надлежащего цитирования также должно быть исправлено; 'echo '$ pw" '. – tripleee

0

Второй (и все последующие) аргумент grep это имя файла для поиска, а не строка для выполнения согласования против.

Кроме того, grep печатает совпадающую строку или (с -o) совпадающую строку, а не любые скобки в скобках. Для этого вам нужен другой инструмент.

Минимально фиксируя код будет

x=$(pwd) 
pw=$(printf '%s\n' "$x" | sed 's%\(.*\)/bin.*%\1%') 

(Если вы заботитесь только о Bash, а не в других оболочках, вы могли бы сделать sed ... <<<"$x" без явной трубы;. Синтаксис также несколько более удовлетворяющего)

Но, конечно же, оболочка имеет базовые функции обработки строк встраивается.

pw=${x%/bin*} 
1

Все, что вы делаете может быть сделано в один echo:

echo "${PWD%/*}" 

$PWD переменная представляет текущий каталог и %/* удаляет последний / и часть после последнего /.

В вашем случае это будет выход: /root/abc

 Смежные вопросы

  • Нет связанных вопросов^_^