Удалить пустые строки в текстовом файле с помощью grep


Ответы:


132

grep . FILE


(И если вы действительно хотите сделать это в СЭД, то: sed -e /^$/d FILE)

(И если вы действительно хотите сделать это в AWK, то: awk /./ FILE)


1
Сладкий! TY и для других команд, но похоже, что grep - мой новый лучший друг.
user191960

grep. FILE у меня не работает. Вероятно, лучше использовать grep для поиска содержимого файла и sed для редактирования содержимого файла.
Майкл Диллон,

7
sed -ne/./pтоже работает, и awk /./короче (действие, {print}если не указано). @ ghostdog74: grep '[^[:space:]]'тогда.
эфементный

5
Для тех, кто не понимает, .это регулярное выражение, которое соответствует любому символу, кроме новой строки.
Висбаки

3
grep . FILEработает с данным примером, но не обязательно, когда файл может иметь байты, не являющиеся частью кодировки. Например, с GNU grep 2.20 printf "\x80\n" | grep .ничего не выводит.
vinc17

37

Попробуйте следующее:

grep -v -e '^$'

это имеет тот же эффект, что и grep. ФАЙЛ в этом пробеле в виде пустой строки будет захвачен.
ghostdog74

1
"grep" ищет любую строку, соответствующую шаблону. "." соответствует любому символу. «grep. FILE» соответствует любой строке, содержащей хотя бы 1 символ. В то время как «grep -v» исключает строки, соответствующие шаблону. OP сказал: «Удалите все пустые новые строки». Если вы хотите исключить строки с пробелами, используйте grep -v '^ $'. " " Будет соответствовать нулю или более предшествующему шаблону, в данном случае пробелу. Хотя вы, возможно, предпочтете сопоставить и исключить другие символы пробела (табуляции, каналы форм и т. Д.).
Мистер Ри,

3
Этот метод позволил мне объединить несколько исключений проще, чем просто "grep. FILE". Например, я просматривал файл conf и хотел исключить все закомментированные строки и все пустые строки. Поэтому я использовал "grep -v -e '#' -e '^ $' squid.conf". Получилось удовольствие.
Ben K

2
этот намного быстрее, чем grep. ФАЙЛ'. Это связано с более сложными задачами проверки регулярного выражения '.' чем исключение, если ^ $ не совпадает.
Эдуард Лопес

2
grep -v -e '^$'всегда работает, чего нет grep .. Например, с GNU grep 2.20 printf "\x80\n" | grep .ничего не выводит, а printf "\x80\n" | grep -v '^$'выводит непустую строку.
vinc17

11
with awk, just check for number of fields. no need regex

$ more file
hello

world

foo

bar

$ awk 'NF' file
hello
world
foo
bar

Не требует цитат. Этот трюк встречается awk1line.txt- опять же, как и большинство
неловких

2
Это просто моя хорошая практика - помещать кавычки, так как вы запускаете его из оболочки ... для составных операторов awk вам все равно нужно помещать кавычки. Так почему бы не развить эту привычку.
ghostdog74

объяснение того, как это работает: stackoverflow.com/questions/23544804/…
wisbucky

9

Вот решение, которое удаляет все строки, которые либо пустые, либо содержат только символы пробела:

grep -v '^[[:space:]]*$' foo.txt

2

Попробуй это: sed -i '/^[ \t]*$/d' file-name

Он удалит все пустые строки, у которых нет. пробелов (пробелов или табуляций), т.е. (0 или более) в файле.

Примечание: внутри квадратной скобки стоит пробел, за которым следует «\ t».

Модификатор -iзаставит записать обновленное содержимое обратно в файл. Без этого флага вы можете увидеть, что на экране были удалены пустые строки, но сам файл не будет затронут.


1

grep '^..' my_file

пример

THIS

IS

THE

FILE

EOF_MYFILE

он дает в качестве вывода только строки, содержащие не менее 2 символов.

THIS
IS
THE
FILE
EOF_MYFILE

Смотрите также результаты с grep '^' my_fileвыходами

THIS

IS

THE

FILE

EOF_MYFILE

а также с grep '^.' my_fileвыходами

THIS
IS
THE
FILE
EOF_MYFILE

1

Если удаление пустых строк означает строки, включающие любые пробелы, используйте:

grep '\S' FILE

Например:

$  printf "line1\n\nline2\n \nline3\n\t\nline4\n" > FILE
$  cat -v FILE
line1

line2

line3

line4
$  grep '\S' FILE
line1
line2
line3
line4
$  grep . FILE
line1
line2

line3

line4

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


0

Попробуйте ex -way:

ex -s +'v/\S/d' -cwq test.txt

Для нескольких файлов (редактирование на месте):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Без изменения файла (просто распечатайте на стандартном выходе):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

Perl может быть излишним, но он работает так же хорошо.

Удаляет все пустые строки:

perl -ne 'print if /./' file

Удаляет все строки, которые полностью пустые или содержат только пробелы:

perl -ne 'print if ! /^\s*$/' file

Вариант, который редактирует оригинал и создает файл .bak:

perl -i.bak -ne 'print if ! /^\s*$/' file

0

Если вы хотите знать, сколько всего строк кода находится в вашем проекте Xcode, и вас не интересует перечисление количества для каждого быстрого файла, тогда это даст вам ответ. Он удаляет строки без кода и удаляет строки с префиксом комментария.//

Запустите его на корневом уровне вашего проекта Xcode.

find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l

Если в вашем коде есть блоки комментариев, начинающиеся /*и заканчивающиеся */такими, как:

/*
 This is an comment block 
*/

тогда они будут включены в подсчет. (Слишком сложно).


0

Самый простой ответ -----------------------------------------

[root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
[root@node1 ~]#
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.