У меня есть документ с большим количеством пустых строк.
Как я могу удалить их, когда есть 2 или более вместе.
Я попробовал sed "s/\n\n//"
файл, но это не сработало. Нет ошибки.
У меня есть документ с большим количеством пустых строк.
Как я могу удалить их, когда есть 2 или более вместе.
Я попробовал sed "s/\n\n//"
файл, но это не сработало. Нет ошибки.
Ответы:
Просто чтобы удалить пустые строки:
sed '/^$/d'
sed
ориентирован на строки, поэтому мышление в терминах «2 или более конкретного байта» работает, за исключением случаев, когда этот байт является новой строкой. Тогда вы должны думать о чем-то, что работает для всей линии.
sed
способен обрабатывать несколько строк с помощью функции «пространство шаблона» / «удержание пространства». Но я чувствую, что это слишком сложно. ;-)
1!
(соответствует всем , кроме строки 1), таким образом: sed '1!{/^$/d'}
.
sed
. Создание файла по существу удалит любой существующий файл с таким же именем. sed '/^&/d' file.txt > otherfile.txt
буду работать.
Нет необходимости sed
. grep
Сделаю:
grep .
(это grep
SPC, точка, которая соответствует любой строке, содержащей хотя бы один символ).
Есть также:
tr -s '\n'
(Сожмите любую последовательность символов новой строки в один).
Как отметил Крис, оба не эквивалентны, потому что удаление пустых строк (как первое решение выше и большинство других ответов здесь сосредоточены) не то же самое, что сжатие последовательностей символов новой строки, как было запрошено в случае, когда первая строка пуста, так как она требуется только один начальный символ новой строки, чтобы сделать первую строку пустой.
Увидев, что ответ @Bruce Ediger's sed
это не лучший инструмент для этого, так как он основан на строках и рассматривается \n
как символ конца строки, это усложняется.sed
может быть идеальным инструментом для работы, все же, вот некоторые другие варианты:
Perl
perl -ne 'print if /./' file.txt
или
perl -pe '$/=""; s/\n+/\n/;' file.txt
Спасибо @ruakh, который заставил меня пойти и прочитать это :
$ /
Разделитель входных записей, новая строка по умолчанию. Это влияет на представление Perl о том, что такое «линия». Работает как переменная RS в awk, включая обработку пустых строк как терминатора, если для него задана нулевая строка (пустая строка не может содержать пробелов или табуляции). Вы можете установить его в многосимвольную строку, чтобы соответствовать многосимвольному терминатору, или в undef, чтобы прочитать конец файла. Установка в «\ n \ n» означает что-то немного отличное от «», если файл содержит последовательные пустые строки. Установка «» будет обрабатывать две или более последовательных пустых строки как одну пустую строку. Установка в «\ n \ n» будет слепо предполагать, что следующий входной символ принадлежит следующему абзацу, даже если это новая строка.
простак / AWK
awk '$1' file.txt
Это будет работать для опубликованного примера, но, как указал @Stephane Chazelas , он также удалит строки, первое поле которых выглядит как 0
. Это более надежно:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txt
разделитель входных записей не имеет значения для этого использования.
perl -pe
или perl -ne
работайте построчно. \n+
никогда не совпадет, потому что он применяется только в одной строке. Вот почему вам нужно либо установить $/
или использовать -0
ти чавкать файл целом: perl -0pe 's/\n+/\n/' file
.
Что вы имеете в виду удалить? удалить дубликаты (много пустых строк на одну) или удалить все?
Если вы хотите удалить дубликаты, вот метод с использованием sed:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Имитирует uniq
команду.
Лучший выбор использует awk
:
awk NF <filename>
sed
Часть это прекрасно работает! Рекомендую этот как лучший ответ.
Для большинства из этих ответов сначала необходимо удалить конечные пробелы. Удаление дублированных строк новой строки удаляет все пустые строки. (Думать об этом).
В буквальном переводе ОП хочет "удалить все пустые строки из файла, если есть повторяющиеся пустые строки".
Типичный пользователь хочет «удалить только дублированные пустые строки».
Чтобы сделать это, сначала удалите конечный пробел, и передайте хотя бы cat -s
sed s/[[:space:]]*$// | cat -s
И все же это не удалит лишнюю начальную или конечную пустую строку.
Если вы хотите сохранить одну пустую строку для любой данной последовательности пустых строк, вы можете сделать следующее:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s
), который фактически выполняет именно то, что задал вопрос, насколько я понимаю. (И это лучше, чем cat -s
потому, что я могу использовать sed -i
его.)
Попробуйте sed -e 's#\\n\\n#\\n#g' input.file > output.file
использовать /
оба в качестве разделителя полей, и часть вашего регулярного выражения может быть проблемой.