2016-10-20 6 views
0

Использование bash Я пытаюсь извлечь только цифры перед строкой.Мне нужно извлечь числа из строки

Например:

7prob542334 

Ожидаемый результат:

7 

Но я бегу в ошибку, когда у меня есть

27prob542334 

Ожидаемый результат:

27 

вместо этого я получить 2

Это код, который я до сих пор:

max=$(ls -LR $ARCHIVE | grep ^prob | sed 's/_.*//' | uniq -c | sort -rn | tr -d ' '| head -n1 | head -c1) 

Archive это путь к директории с подкаталогами, в которых хранятся файлы, такие как prob542334_05. Я удалил символ подчеркивания и отсортировал файл в зависимости от его появления. Тогда я стараюсь извлекать только количество вхождений как "7" или "27"

+0

много других проблем с вашим кодом, такие как [ParsingLs] (http://mywiki.wooledge.org/ParsingLs), используя 'uniq' на возможно несортированном вводе и т. Д. ... хорошая идея для всего шаблона цитат .. для ex' grep '^ prob'' – Sundeep

+0

, если вы можете описать, каков ваш полный вопрос, вы можете избежать [xy проблема] (http://meta.stackexchange.com/questions/66377/what-is-the-x y-problem) ... см. также: https://stackoverflow.com/help/mcve – Sundeep

ответ

3

С расширением bash параметра:

${var%%[[:alpha:]]*} 
  • Мы с жадностью удаления подстроки из правых (%%), от конца до первого алфавитного ([[:alpha:]]*) символ (слева).

Пример:

$ var='7prob542334' 

$ echo "${var%%[[:alpha:]]*}" 
7 

$ var='27prob542334' 

$ echo "${var%%[[:alpha:]]*}" 
27 
+1

В более общем плане мы можем написать: '$ {var %% [^ [: digit:]] *}' - удалить первый * non-digit * и все последующие символы –

2
echo 127prob542334 |grep -o '^[0-9]*' 
127 

echo 17prob542334 |grep -oP '^\d*' 
17 
2
echo 127prob542334 | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//' 

ИЛИ

echo 127prob542334 | grep -o '^[0-9]*' 
+1

Последний не работает. –

+0

К сожалению, я пропустил котировки –

+0

да. Я так проверю –

3

bash Использование «сек собственное regex соответствие с ([[:digit:]]+)(.*)

$ string="7prob542334" 
$ [[ $string =~ ([[:digit:]]+)(.*) ]] && num=${BASH_REMATCH[1]} 
$ printf "%s\n" "$num" 
7 

$ string="27prob542334" 
$ [[ $string =~ ([[:digit:]]+)(.*) ]] && num=${BASH_REMATCH[1]} 
$ printf "%s\n" "$num" 
27 
+2

Вам не нужно записывать остальную часть строки: '[[$ string = ~^([[: digit:]] +). *]]' –

0
echo '27prob542334' |grep -Po '^\d+' 
+0

Хотя этот код может помочь решить проблему проблема, она не объясняет _why_ и/или _how_, она отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшит его долгосрочную образовательную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, включая ограничения и допущения. –

1

В AWK:

$ echo 127prob542334|awk 'sub(/[^0-9].*/,"") || 1' 
127 

Bash:

$ i=127prob542334 
$ echo ${i%%[^0-9]*} 
127 
1

С awk, вы можете использовать команду printf, которая будет принимать только дробную часть строки заданной в аргументе:

echo "127prob542334" | awk '{printf "%d\n",$1}' 
1

Если Perl вариант:

echo 27prob542334 | perl -lne 'print $1 if /^(\d+)/'

выходы:

27

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