От новичка до гуру: Курсы программирования на CyberDuff

Удалите завершающие символы новой строки с помощью GNU sed

Я пытаюсь использовать sed однострочник для удаления завершающих символов новой строки, используя один из удобные однострочники sed:

sed --in-place -e :a -e '/^\n*$/{$d;N;ba}'

Он работает для новых строк в стиле UNIX, но не для новых строк в стиле DOS. Несмотря на то, что я не мог точно разобраться в sed синтаксисе сценариев и правилах сопоставления, я попробовал следующее:

sed --binary --in-place -e :a -e '/^\(\r\?\n\)*$/{$d;N;ba}'

но это не помогло, и я действительно не знаю почему.

Я действительно не хочу использовать Perl и т. Д., Я хочу придерживаться более «основных» утилит. Итак, есть ли поблизости какие-нибудь sed гуру? Буду очень признателен за вашу помощь. Я использую дистрибутив Cygwin sed.

Спасибо.

В частности, мне нужен этот файл (распечатанный с использованием cat -A):

1^M$
^M$
^M$

стать этим:

1$
13.12.2015

  • dos2unix файл, а затем запустите свой sed. 13.12.2015
  • @pvg Я хочу создать псевдоним в моем .bashrc, поэтому мне бы очень хотелось, чтобы это была одна команда, потому что конвейер dos2unix и sed сложнее, чем запуск sed в одиночку. 13.12.2015
  • На самом деле не должно быть проблем. Или просто сделайте это функцией bash, чтобы ее было легче читать и поддерживать. stackoverflow.com/questions/756756 / 13.12.2015
  • @pvg Да, но тогда для каждого файла потребуется отдельный вызов sed (dos2unix и т.д.) ... Я знаю, что могу просто создать функцию, но мне просто интересно, могу ли я сделать это проще. 13.12.2015
  • Если вы хотите удалить символы новой строки только из конца файла, но не из его середины, это не лучший пример ввода / вывода. 13.12.2015

Ответы:


1

Вы пытаетесь использовать неправильный инструмент для работы. sed предназначен для простых замен в отдельных строках, вот и все. Для чего-то даже более интересного вам следует использовать awk, например один подход с GNU awk будет:

$ cat -v file
1^M
^M
^M
$ awk -v RS='^$' -v ORS= '{sub(/(\r?\n)+$/,"\n")}1' file | cat -v
1

с другими awks:

$ awk '{rec = rec $0 RS} END{sub(/(\r?\n)+$/,"\n",rec); printf "%s",rec}' file | cat -v
1

Вышеупомянутое будет работать независимо от того, заканчиваются ли строки DOS или UNIX.

13.12.2015
  • Эй, твой ответ мне подходит! Моя команда испортила выводимые символы новой строки .. По крайней мере, в Linux .. 13.12.2015

  • 2

    Не могли бы вы использовать tr вот так?

    tr -d '\r\n' < file1 > tempfile && mv tempfile file1
    

    Это переведет file1 и удалит \r\n.

    13.12.2015
  • Я мог бы, но я действительно хотел сделать это с помощью одной программы (например, sed), потому что я хотел alias все это в моем .bashrc. Создание функции потребует нескольких sed вызовов для кучи файлов и т. Д., Поэтому было бы очень полезно один вызов программы. 13.12.2015

  • 3

    Да, это сработало:

    sed --binary --in-place -e :a -e '/^\(\r\n\)*\r$/{$d;N;ba}'
    

    На самом деле предпочел бы удалить вопрос, но уже слишком поздно.

    13.12.2015
    Новые материалы

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..

    Как работает дистанционное парное программирование и почему оно может изменить вашу жизнь
    Серебряная пуля от одиночества и отвлекающих факторов во время обучения программированию Независимо от того, работаете ли вы или учитесь удаленно, велика вероятность, что одиночество и..