Итак, у меня есть строка:
ID: 54376
Можете ли вы помочь мне сделать регулярное выражение, которое будет возвращать только числа без "ID:"?
ПРИМЕЧАНИЕ. Эта строка находится в файле.
Итак, у меня есть строка:
ID: 54376
Можете ли вы помочь мне сделать регулярное выражение, которое будет возвращать только числа без "ID:"?
ПРИМЕЧАНИЕ. Эта строка находится в файле.
Ответы:
Попробуй это:
grep -oP '(?<=ID: )[0-9]+' file
или:
perl -nle 'print $1 if /ID:.*?(\d+)/' file
-o
и -P
являются расширениями GNU для grep
. -o
работает и на BSD. Поддержка PCRE с -P
не всегда компилируется.
Используйте egrep
с -o
или grep
с -Eo
опцией, чтобы получить только соответствующий сегмент. Используйте в [0-9]
качестве регулярного выражения, чтобы получить только цифры:
grep -Eo [0-9]+ filename
Есть много способов сделать это. Например:
Используйте GNU grep
с последними PCRE и сопоставьте числа после ID:
:
grep -oP 'ID:\s*\K\d+' file
Используйте awk
и просто напечатайте последнее поле всех строк, начинающихся сID:
awk '/^ID:/{print $NF}' file
Это также будет печатать поля, которые не являются числами, хотя, чтобы получить только цифры, и только во втором поле, используйте
awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
Используйте GNU grep с расширенными регулярными выражениями и проанализируйте его дважды:
grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
\K
делает в первом примере?
-o
печатать только совпадающую часть, а также отбрасывать вещи, которые мне не интересны. Сравнить echo "foobar" | grep -oP "foobar"
иecho "foobar" | grep -oP 'foo\Kbar'
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'
Это будет печатать только все числа и пробелы, встречающиеся после ID: 54376
в любом файле ввода.
Я только что немного обновил вышеперечисленное, чтобы сделать его немного быстрее *
и не p
набирать пустые строки после удаления не числовых символов.
В нем рассматриваются строки из регулярных выражений /ID: 54376/
,
через $
последний и на них s///
удаляет все или любые *
символы , ^
не [^ 0-9]*
то p
rints /
любую /
строку, содержащую .
символ остальные.
{
echo line
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'
54376
1 03 2
3 03 4
5 03 6
7 03 8
9 03 10
54376
Используя sed:
{
echo "ID: 1"
echo "Line doesn't start with ID: "
echo "ID: Non-numbers"
echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'
Это -n
«ничего не печатать по умолчанию», /^ID: [0-9][0-9]*$/
это «для строк, соответствующих этому регулярному выражению» (начинается с «ID:», затем 1 или более цифр, затем конец строки), и s/ID: //p
имеет форму s/pattern/repl/flags
- s
означает, что мы Вы делаете замену, чтобы заменить шаблон "ID: "
заменяющим текстом ""
(пустой строкой), используя p
флаг, который означает «напечатать эту строку после выполнения замены».
Вывод:
1
4
Еще одна команда GNU sed,
sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file
Он печатает любое число после ID:
+
. Если разница между один символов и 3 -х символов ваш скрипт не может работать во всех sed
с , которые вы , вероятно , следует сделать следующее : sed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'
. Ваш ответ также пропускает первый ID: [0-9]
в строке, содержащей два вхождения ID: [0-9]
.
Используйте grep + awk:
grep "^ID" your_file | awk {'print $2'}
Бонус: легко читается :)
grep
если вы используете awk
. awk '/^ID/ { print $2 }'
делает то же самое и избегает проблем с буферизацией строки grep . Это также похоже на одно из решений в ответе @ terdon.