Удалите пустые строки в файле с помощью sed

France  211 55  Europe

Japan   144 120 Asia
Germany 96  61  Europe

England 94  56  Europe




Taiwan  55  144 Asia
North Korea 44  2134    Asia

Это мой файл данных.

В нем есть пустые строки.

В этих пустых строках нет пробелов или табуляции.

Я хочу удалить все пустые строки в данных.

Я сделал поиск, Удалите пустые строки с помощью SED дал идеальный ответ.

До этого я сам писал два код sed:

sed -r 's/\n\n+/\n/g' cou.data
sed 's/\n\n\n*/\n/g' cou.data

И я попробовал awk gsub, тоже безуспешно.

awk '{ gsub(/\n\n*/, "\n"); print }' cou.data

Но они не работают и ничего не меняется.

В чем я ошибся в своем коде sed?

Возможный дубликат AWK удалить пустые строки

oliv 10.08.2018 11:10

по умолчанию большинство реализаций sed и awk работают построчно, удаляют новую строку из ввода и добавляют ее обратно во время печати .. поэтому \n никогда не будет соответствовать, если вы не используете другие функции sed / awk, чтобы иметь более одной строки для работы с

Sundeep 10.08.2018 11:27

Предлагаю: grep . file

Cyrus 10.08.2018 12:24

может это поможет unix.stackexchange.com/questions/180901/…

Lino 10.08.2018 16:31
sed '/^$/d' data?
PesaThe 10.08.2018 20:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
3 270
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте следующий sed, чтобы удалить все пустые строки.

sed '/./!d' cou.data

Объяснение:

  • /./ соответствует любому символу, включая новую строку.
  • ! отменяет селектор, то есть заставляет команду применяться к строкам, которые не соответствуют селектору, который в данном случае является пустой строкой (ами).
  • d удаляет выбранную строку (строки).
  • cou.data - это путь к входному файлу.

Где ты ошибся?

В следующем отрывке из Как работает sed говорится:

sed operates by performing the following cycle on each line of input: first, sed reads one line from the input stream, removes any trailing newline, and places it in the pattern space. Then commands are executed; each command can have an address associated to it: addresses are a kind of condition code, and a command is only executed if the condition is verified before the command is to be executed.

When the end of the script is reached, unless the -n option is in use, the contents of pattern space are printed out to the output stream, adding back the trailing newline if it was removed.8 Then the next cycle starts for the next input line.

Я намеренно выделил те части, которые имеют отношение к тому, почему ваши примеры sed не работают. Учитывая ваши примеры:

  • Похоже, они не обращают внимания на то, что sed читает по одной строке за раз.
  • Завершающие символы новой строки (\n\n и \n\n\n в вашем первом и втором примере соответственно), которым вы пытаетесь сопоставить, на самом деле не существуют. Они были удалены к моменту выполнения вашего шаблона регулярного выражения и затем восстановлены, когда будет достигнут конец скрипта.

Ответ RobC хорош, если ваши строки заканчиваются только новой строкой (перевод строки или \ n), потому что SED разделяет строки таким образом. Если ваши строки завершаются \ r \ n (или CRLF) - что может быть у вас по причинам даже в системе unix - вы не получите совпадения, потому что с точки зрения sed строка не пуста - \ r (CR) считается персонажем. Вместо этого вы можете попробовать:

sed '/^\r$/d' filename

Объяснение:

  • ^ соответствует началу строки
  • \r соответствует возврату каретки
  • $ соответствует концу строки
  • d удаляет выбранную строку (строки).
  • filename - это путь к входному файлу.

Другие вопросы по теме