LINUX.ORG.RU

Найти строки, содержащие числа

 ,


0

1

Хочу из файла вытащить все строки, содержащие натуральные числа, но не в начале строки. Пробую так:

grep -E '[^^][1-9]?[0-9]+' file.txt
Но это все равно выводит строчки, начинающиеся с двухзначных или более чисел, хотя не выводит строки, в начале которых стоит одна цифра. Почему так получается и как это исправить? Вроде явно же указал, что первый символ — не начало строки, должно работать.

★★★★

Что-то типа такого попробуйте. Но нужна будет perl-реализация из-за отрицательного предпросмотра.

grep -P '(?!^)\b[0-9]{1,}'
Deleted
()
Ответ на: комментарий от anonymous

если еще сильнее уточнить, то \d+. Но сути оно не меняет.

Deleted
()

Вроде явно же указал, что первый символ — не начало строки, должно работать.

Ваше ясное [^^] означает любой символ кроме крышечки. Если я понял правильно задачу, то тогда как-то так:

grep -E '^[^[:digit:]]+([1-9][0-9]*|0[^[:digit:]]+|0$)'

vodz ★★★★★
()

вытащить строки начинающиеся с не-цифры и содержащие хотя-бы одну цифру:

grep -E '^[^0-9].*[0-9].*'

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от vodz

Но крышечка означает начало строки. Так написано в man re_format: «An atom is a ... '^' (matching the null string at the beginning of a line)», кроме специального случая [^, где первая крышечка означает отрицание.

hotpil ★★★★
() автор топика
Ответ на: комментарий от hotpil

кроме специального случая [^, где первая крышечка означает отрицание.

Ну и? У вас именно это и написано.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Первая крышечка должна обозначать отрицание. Вторая должна быть началом строки.

hotpil ★★★★
() автор топика

Разбейте на два шага:

1. Отфильтровать строки, начинающиеся с цифры:

grep -E -v '^[0-9]'
2. Найти строки, содержащие числа, начинающиеся не с нуля.

Эти шаги объединяете в конвейер.

akk ★★★★★
()
Ответ на: комментарий от vodz

Нет, [^^] это «не начало строки», например

 grep -E '[^^]A' 
найдет все строки, в которых есть буква A, но не в начале.

hotpil ★★★★
() автор топика
Ответ на: комментарий от hotpil

Нет, [^^] это «не начало строки», например

Ну, допустим, вы где-то вычитали или просто тормозите. Но, проверить было слабо?

echo -e "A\n^A\nAA\nxA" | grep -E '[^^]A' 
AA
xA
То есть сработает если в начале любой символ кроме крышечки.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

Да, как оказалось, «all other special characters, including '\', lose their special significance within a bracket expression.» Поэтому внутри скобок крышечка не работает. Для моей задачи подойдет что-то такое:

 grep -E '^[^0-9].*[1-9]?[0-9]+' test.txt 

hotpil ★★★★
() автор топика
Ответ на: комментарий от hotpil

Для моей задачи подойдет что-то такое:

Я вам давал уже своё решение. В этом же решении .* может быть что угодно, в том числе и цифры, потому проверка [1-9]не сработает, если под . будет ненужный вам 0.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.