У меня есть документ с большим количеством пустых строк.
Как я могу удалить их, когда есть 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 .
(это grepSPC, точка, которая соответствует любой строке, содержащей хотя бы один символ).
Есть также:
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использовать /оба в качестве разделителя полей, и часть вашего регулярного выражения может быть проблемой.