Я намагаюся видалити порожні рядки за допомогою sed:
sed '/^$/d'
але мені не пощастило з цим.
Наприклад, у мене є такі рядки:
xxxxxx
yyyyyy
zzzzzz
і я хочу, щоб це було так:
xxxxxx
yyyyyy
zzzzzz
Яким має бути код для цього?
Я намагаюся видалити порожні рядки за допомогою sed:
sed '/^$/d'
але мені не пощастило з цим.
Наприклад, у мене є такі рядки:
xxxxxx
yyyyyy
zzzzzz
і я хочу, щоб це було так:
xxxxxx
yyyyyy
zzzzzz
Яким має бути код для цього?
Відповіді:
У вашому "порожньому" рядку можуть бути пробіли чи вкладки. Використання POSIX класів з , sed
щоб видалити всі рядки , що містять тільки пропуски:
sed '/^[[:space:]]*$/d'
Більш коротка версія, яка використовує ERE, наприклад, з gnu sed:
sed -r '/^\s*$/d'
(Зверніть увагу , що СЕД дійсно НЕ підтримує PCRE.)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
відповідатиме всім "порожнім" рядкам, порожній тут означає, що рядок не містить символів, або рядок містить лише порожні рядки (наприклад, пробіли). Усі відповідні рядки будуть видалені sed, d
командою.
Я пропускаю awk
рішення:
awk 'NF' file
Що поверне:
xxxxxx
yyyyyy
zzzzzz
Як це працює? Оскільки NF
означає "кількість полів", у цих рядках, що є порожніми, є 0 фієлів, так що awk оцінює 0 до False, і жоден рядок не друкується; однак, якщо є щонайменше одне поле, оцінка True і змушує awk
виконувати свою дію за замовчуванням: надрукуйте поточний рядок.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
Чи знаєте ви про прекрасний спосіб включити це до сценарію awk, наприклад, у шаблон? awk '/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'
.
sed '/^$/d'
має бути добре, чи очікуєте ви змінити файл на місці? Якщо так, ви повинні використовувати -i
прапор.
Можливо, ці рядки не порожні, тому, якщо це так, подивіться на це питання Видаліть порожні рядки з txtfiles, видаліть пробіли від початку та кінця рядка. Я вважаю, що саме цього ви намагаєтеся досягти.
sed -i '/^$/d'
це один із способів зробити це.
[]
їх не слід уникати в дужковому виразі, тому код тут неправильний для \[\[:space:\]\]
або \[ \t\]
- повинен бути [[:space:]]
і [ \t]
.
Я вважаю, що це найпростіший і найшвидший:
cat file.txt | grep .
Якщо вам також потрібно ігнорувати всі пробіли, спробуйте:
cat file.txt | grep '\S'
Приклад:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
виходи
7
5
cat
, також grep
бере файли:grep . file.txt
grep '\S'
точно не є портативним. Якщо у вас є, grep -P
то ви можете використовувати, grep -P '\S'
але це не підтримується на всіх платформах.
grep .
порівняно з іншими рішеннями є те, що воно виділить увесь текст червоним кольором. Інші рішення дозволяють зберегти оригінальні кольори. Порівняйте unbuffer apt search foo | grep .
зunbuffer apt search foo | grep -v ^$
За допомогою прийнятої тут відповіді та прийнятої відповіді вище, я використав:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
Це охоплює всі основи і прекрасно працює для моїх потреб. Кудос до оригінальних плакатів @Kent та @kev
Інший варіант без sed
, awk
, perl
і т.д.
strings $file > $output
рядки - друкуйте рядки символів для друку у файлах.
strings
замість string
?
Це працює також дивним чином.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
Ви, швидше за все, бачите несподівану поведінку, оскільки ваш текстовий файл створений у Windows, тому послідовність завершення рядка є \r\n
. Ви можете використовувати dos2unix для перетворення його в текстовий файл стилю UNIX перед запуском sed або використання
sed -r "/^\r?$/d"
щоб видалити порожні рядки, незалежно від того, є або повернення вагона.
-r
прапор і чи можна комбінувати його з тим, -i
щоб безпосередньо змінювати файл та уникати друку на екран. Крім того, я думаю, що ця команда також sed -r "/^\r$/d"
Моя bash
специфічна відповідь полягає в тому, щоб рекомендувати для цього використовувати perl
оператор підстановки з глобальним g
прапором шаблону :
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
Ця відповідь ілюструє облік того, чи є порожні рядки в них пробіли ( [\ ]*
), а також використання |
для розділення кількох пошукових термінів / полів. Тестували на macOS High Sierra та CentOS 6/7.
FYI, оригінальний код OP sed '/^$/d' $file
працює чудово в bash
Terminal на macOS High Sierra та CentOS 6/7 Linux на високопродуктивних кластерах суперкомп'ютерів.
Для мене з FreeBSD 10.1 з sed працював тільки це рішення:
sed -e '/^[ ]*$/d' "testfile"
всередині []
знаки пробілу та вкладки.
тестовий файл містить:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============