Как убрать строки короче XY?

29

Я нашел вопрос о том, как удалить строки длиннее 2048 символов:

Как удалить строку, если она длиннее XY?

Q: Но как я могу удалить строки короче 4 символов? Так что удалите строки, которые имеют 1 или 2 или 3 длины в файле.

ОБНОВЛЕНИЕ: Спасибо за много хороших ответов, но я могу пометить только один как ОК

evachristine
источник

Ответы:

42

Вы могли бы использовать sed. Следующее удалит строки длиной 3 символа или меньше:

sed -r '/^.{,3}$/d' filename

Чтобы сохранить изменения в файле на месте, -iукажите опцию.

Если ваша версия sedне поддерживает расширенный синтаксис RE, то вы можете написать то же самое в BRE:

sed '/^.\{,3\}$/d' filename

который будет работать со всеми sedвариантами.


Вы также можете использовать awk:

awk 'length($0)>3' filename

Использование perl:

perl -lne 'length()>3 && print' filename
devnull
источник
sed '/^.\{,3\}$/d'не работает с BSD СЭД: sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). Версия sed -r синтаксически допустима, но не удаляет строки.
Дерексон
5

Еще несколько вариаций:

grep .... file

или

sed '/..../!d' file

или

sed -n 's/./&/4p' file

или

awk 'gsub(/./,"&")>3' file

или

awk 'length>3' file

или GNU awk:

awk 'NF>3' FS= file
Scrutinizer
источник
1
О, этот Грэп .... такой элегантный!
Грофте
3

Вот решение Vim с использованием Ex-режима Vim и globalкоманды.

Это очень похоже на использование sed, только некоторые специальные символы ('{', '}') должны быть экранированы.

:g/^.\{,3\}$/d

Используя режим очень магического регулярного выражения Vim (\ v), этого можно избежать.

:g/\v^.{,3}$/d

Смотрите также: помогите магии

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

Также иногда полезно сделать наоборот vglobal.

:v/\v^.{,3}$/d

удалил бы все, кроме строк до 3 символов.

gergap
источник
1

для непосредственного удаления строк вы можете:

sed -ri '/.{4}/!d' /path/to/file

Или BRE:

sed -i '/.\{4\}/!d' /path/to/file

Если строка не содержит 4 или более символов, она удаляется.

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

Выполнение вышеуказанного в подзаголовке подстановки команд гарантирует, что он grepполучит дескриптор чтения до того, как cat начнет запись в него, но также <<HEREDOCбудет гарантировать, что результат останется потоковым и не вызовет ошибок длины аргумента.

mikeserv
источник
0
sed '/^.\?.\?.\?$/d' input.txt > output.txt
Хауке Лагинг
источник
0

Вы можете использовать grep:

Если вы считаете начальные пробелы в длине строки:

grep -e '[^\ ]\{4,\}' file

Если вы не считаете начальные пробелы в строке:

grep -e '[^\]\{4,\}' file
cuonglm
источник