Итак, у меня есть строка:
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]*то prints /любую /строку, содержащую .символ остальные.
{
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.