Як видалити лінії, коротші за XY?


29

Я знайшов питання про те, як видалити рядки довше 2048 знаків:

Як видалити рядок, якщо довше XY?

Питання: Але як я можу видалити рядки, менші за 4 символи? Тому видаліть рядки, що мають у файлі 1 або 2 або 3 довжини.

ОНОВЛЕННЯ: Дякую за багато хороших відповідей, але я можу позначити лише одну як ОК

Відповіді:


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

sed '/^.\{,3\}$/d'не працює з BSD sed : 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

1
О, ця грепа .... така елегантна!
grofte

3

Ось рішення Vim, використовуючи режим Ex та globalкоманду Vim .

Це дуже схоже на використання 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 знаків.


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отримання на ньому дескриптора читання, перш ніж кішка почне писати до нього, але <<HEREDOCтакож забезпечить, щоб результат залишався потоковим і не спричиняв помилок у довжині аргументів.



0

Ви можете використовувати grep:

Якщо підрахувати провідні пробіли по довжині:

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

Якщо ви не рахуєте провідних пробілів у рядковій довжині:

grep -e '[^\]\{4,\}' file
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.