Я нашел похожий вопрос:
Но в этом случае я хочу проверить не общую длину, а количество цифр в строке. Например, из этого ввода:
cdc85e24-b9e9-8802-080a-b84479e1ae82
ekodeveloper0
1795475824.1129747.1472396049615.ref
1795475824.1129747.1472396049615
967175540.1194446.1472407271491
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Как удалить все строки, содержащие более N цифр?
решение1
Поскольку вы отметили свой вопрос тегом perl
, один из способов сделать это в Perl — воспользоваться тем фактом, что Perl tr
возвращает счетчик количества замененных символов; так, например (взяв N = 13
) вы можете сделать
perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Возможно, более традиционным способом было бы оценить соответствие регулярному выражению в скалярном контексте, чтобы получить количество
perl -ne '$c = () = /\d/g; print unless $c > 13' file
См. напримерСуществует ли сокращение Perl для подсчета количества совпадений в строке?
решение2
Проще оставить только строки, содержащие X илиболеечисла. Вот пример, где X — это 13:
sed -n 's/[0-9]/&/13p' input.txt > output.txt
Однако вы можете изменить это, чтобы сделать наоборот. Вот команда, которая сохранит только строки, имеющиеменее 13числа:
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
Пояснение - печатать только строки с 13+ числами
sed -n 's/[0-9]/&/13p' input.txt > output.txt
Символ &
в заменяющем тексте означает «все, что было сопоставлено».
Числовой флаг в s
команде (после /find/replace/
части) означает замену только этого экземпляра шаблона поиска.
Флаг p
в s
команде означает «вывести, если была сделана замена».
Переключение -n
, конечно же, отключает действие Sed по умолчанию «печать».
Пояснение - печатать только строки с <13 числами
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
Переключатель -e
— «execute»; он просто передает команду. Он нам здесь нужен, поскольку мы передаем больше одной.
Команда t
пропускает оставшиеся команды, если последняя s
команда выполнила замену.
Команда p
печатает.