Bash - извлекать подстроку до первой цифры - PullRequest
2 голосов
/ 15 октября 2019

У меня есть следующая строка:

test1234a или test1234, например, и я хочу извлечь только test из этой строки.

Я попробовал следующий

echo "Test12h" | sed -e 's/[0-9]\*$//' but is not working. 

Есть ли возможность извлечь подстроку до первой цифры?

Пожалуйста, дайте мне знать, что я пропустил.

Спасибо

Ответы [ 4 ]

6 голосов
/ 15 октября 2019

Правильный инструмент для извлечения подстрок, соответствующих регулярному выражению, из вывода команды: grep. Например,

echo "Test12h" | grep -o '^[^[:digit:]]*'

выведет Test.

Если Test12h находится в переменной, вам даже не нужны внешние утилиты;Расширения параметров могут легко справиться с этим, например:

var='Test12h'
echo "${var%%[[:digit:]]*}"
4 голосов
/ 15 октября 2019

Не могли бы вы попробовать следующее.

sed 's/\([^0-9]*\).*/\1/' Input_file

ИЛИ

sed 's/[0-9][0-9a-zA-Z]*//' Input_file
1 голос
/ 15 октября 2019

Если источник находится в переменной, вы можете использовать подстановка параметров , например:

$ for test in test1234a test1234 Test12h
do
    echo "${test} => ${test//[0-9]*/}"
done
test1234a => test
test1234 => test
Test12h => Test

Где общий формат: ${var//Pattern/Replacement};в вышеприведенном:

  • var == test
  • Patter n == [0-9]* (сначала появление цифры, а затем все, что следует за
  • Replacement == '' (ничего, пустая строка)

Таким образом, в итоге мы удаляем все после первого появления числа.

1 голос
/ 15 октября 2019

Вы сделали небольшую ошибку в своей попытке:

echo "Test12h" | sed -e 's/[0-9].*$//'    # will output Test

\* ожидает ввода *:

echo "Test1*" | sed -e 's/[0-9]\*$//'     # will output Test

.* соответствует любомуколичество любых символов.

...