Получить конкретную строку - PullRequest
2 голосов
/ 02 января 2012

Мне нужно получить определенную строку из большей строки:

Из этих Abcd1234_Tot9012_tore.dr или Abcd1234_Tot9012.tore.dr

Я хочу получить те числа, которые находятся между Tot и _ или ., поэтому я должен получить 9012. Важно то, что количество символов до и после этих цифр может различаться.

Может ли кто-нибудь дать мне хорошее решение для этого? Заранее спасибо!

Ответы [ 7 ]

4 голосов
/ 02 января 2012

Pure Bash:

string="Abcd1234_Tot9012_tore.dr"        # or ".tore.dr"

string=${string##*_Tot}
string=${string%%[_.]*}

echo "$string"

Удалить самую длинную ведущую часть, заканчивающуюся '_Tot'.

Удалить самую длинную завершающую часть, начинающуюся с '_' или '.'.

Результат:

9012
4 голосов
/ 03 января 2012

Это также должно работать, если вы ищете только числа после Тот

[srikanth@myhost ~]$ echo "Abcd1234_Tot9012_tore.dr" | awk ' { match($0,/Tot([0-9]*)/,a); print a[1]; } '
9012
[srikanth@myhost ~]$ echo "Abcd1234_Tot9012.tore.dr" | awk ' { match($0,/Tot([0-9]*)/,a); print a[1]; } '
9012
4 голосов
/ 02 января 2012

Я знаю, что это помечено как bash / sed, но Perl более понятен для такого рода задач, на мой взгляд. Если вам интересно:

perl -ne 'print $1 if /Tot([0-9]+)[._]/' input.txt

-ne указывает perl зациклить указанную однострочную строку во входном файле, ничего не печатая по умолчанию.

Регулярное выражение читается как: соответствует Tot, за которым следует число, за которым следует точка или подчеркивание; захватить номер (это то, что для Parens). Поскольку это первая группа / группа захвата, ей назначена переменная $1, которая затем печатается.

1 голос
/ 03 января 2012

Вы можете использовать perl однострочник:

perl -pe 's/.*(?<=Tot)([0-9]{4}).*/\1/' file

Тест:

[jaypal:~/Temp] cat file
Abcd1234_Tot9012_tore.dr
Abcd1234_Tot9012.tore.dr

[jaypal:~/Temp] perl -pe 's/.*(?<=Tot)([0-9]{4}).*/\1/' file
9012
9012
1 голос
/ 02 января 2012

awk

string="Abcd1234_Tot9012_tore.dr"
num=$(awk -F'Tot|[._]' '{print $3}' <<<"$string")

sed

string="Abcd1234_Tot9012_tore.dr"
num=$(sed 's/.*\([0-9]\{4\}\).*$/\1/' <<<"$string")

Пример

$ string="Abcd1234_Tot9012_tore.dr"; awk -F'Tot|[._]' '{print $3}' <<<"$string"
9012

$ string="Abcd1234_Tot9013.tore.dr"; sed 's/.*\([0-9]\{4\}\).*$/\1/' <<<"$string"
9013
0 голосов
/ 02 января 2012

Это может работать для вас:

echo -e "Abcd1234_Tot9012_tore.dr\nAbcd1234_Tot9012.tore.dr" | 
sed 's/Tot[^0-9]*\([0-9]*\)[_.].*/\n\1/;s/.*\n//'
9012
9012

Это работает одинаково хорошо:

echo -e "Abcd1234_Tot9012_tore.dr\nAbcd1234_Tot9012.tore.dr" |
sed 's/.*Tot\([0-9]*\).*/\1/'
9012
9012
0 голосов
/ 02 января 2012

Используя grep вы можете сделать:

str=Abcd1234_Tot9012.tore.dr; grep -o "Tot[0-9]*" <<< $str|grep -o "[0-9]*$"

ВЫВОД:

9012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...