Видаліть порожні рядки з текстового файлу за допомогою grep


Відповіді:


129

grep . FILE


(І якщо ви дійсно хочете зробити це в СЕД, то: sed -e /^$/d FILE)

(І якщо ви дійсно хочете зробити це в AWK, то: awk /./ FILE)


1
Солодко! ТИ для інших команд - але, схоже, grep - це мій новий найкращий друг.
user191960

grep. ФАЙЛ для мене не працює. Можливо, краще дотримуватися grep для пошуку вмісту файлу та sed для редагування вмісту файлу.
Майкл Діллон,

7
sed -ne/./pпрацює теж, і awk /./коротший (дія, {print}якщо не вказати). @ ghostdog74: grep '[^[:space:]]'тоді.
ефемієнт

5
Для тих, хто не розуміє, .це регулярний вираз, який відповідає будь-якому символу, крім нового рядка.
Wisbucky

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 '^ $'". " " Буде відповідати нулю або більше попереднього шаблону, у цьому випадку пробілу. Хоча, можливо, ви віддасте перевагу збігу та виключенню інших пробілів (вкладки, стрічки форм тощо).
Mr.Ree

3
Цей метод дозволив поєднати декілька виключень легше, ніж просто "grep. FILE". Наприклад, я переглядав файл конфігурації і хотів виключити всі коментовані рядки та всі порожні рядки. Тож я використав "grep -v -e '#' -e '^ $' squid.conf". Працював ласощі.
Бен К

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


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 -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.