Я намагаюся видалити порожні рядки за допомогою 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працює чудово в bashTerminal на 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 =============