sed - как убрать пробелы, табы, переносы строк и слеши

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
Аватара пользователя
hikkispb
Сообщения: 34
ОС: Ubuntu 14.04lts

sed - как убрать пробелы, табы, переносы строк и слеши

Сообщение hikkispb »

Имеются куча таких примеров с ненужными переводами строк, лишними пробелами, обратными слешами маркерами переноса строки.

Код: Выделить всё

  convert present.gif -bordercolor white -border 1x1 \
          -fill red     -draw 'color 0,0 floodfill' \
          -shave 1x1               present_bgnd.gif
https://legacy.imagemagick.org/Usage/color_basics/#replace

Нужно средствами sed превратить это в одну строку без лишних пробелов, переносов строк, и маркеров \ в конце (!) строки.
И завернуть это в xclip, чтобы брать исходный вариант из буфера иксов.

Почти всё я умею под отдельности, но не настолько хорошо знаю sed, чтобы уместить в один скрипт. ХЕЛП.

вставить буфер обмена X
echo $(xclip -o)

Удалить двойные пробелы:
printf "one two three" | sed 's/ \{1,\}/ /g'

Удалить переносы строк:
printf "line1 \nline2\n" | sed ':a; /$/N; s/\n//; ta'

Да, я знаю, что можно и так, но я не хочу конвеерный зверинец с разными утилитами.
printf "line1 \nline2\n" | tr -d '\n'
Начинающий пингвин. Изображение
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: sed - как убрать пробелы, табы, переносы строк и слеши

Сообщение Bizdelnick »

Как-то так sed -E ':getline s/\\$//; T endline; N; b getline; :endline s/\s+/ /g' (проверял только в GNU sed).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
hikkispb
Сообщения: 34
ОС: Ubuntu 14.04lts

Re: sed - как убрать пробелы, табы, переносы строк и слеши

Сообщение hikkispb »

Не проходит в обычном sed 4.8

Код: Выделить всё

printf "line1 \ \nline2\n" | sed -E ':getline s/\\$//; T endline; N; b getline; :endline s/\s+/ /g'
line1 \ 
line2
Начинающий пингвин. Изображение
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: sed - как убрать пробелы, табы, переносы строк и слеши

Сообщение Bizdelnick »

Так а зачем там пробел после '\'? Расчёт был на синтаксически корректный скрипт, если на входе что-то другое — адаптируйте.

Shell

% printf 'line1 \\\nline2\n' | sed -E ':getline s/\\$//; T endline; N; b getline; :endline s/\s+/ /g'
line1 line2
% sed --version
sed (GNU sed) 4.7
Упакован Debian
Copyright © 2018 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <https://gnu.org/licenses/gpl.html>
Это свободное ПО: вы можете изменять и распространять его.
Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.

Авторы программы — Джей Фенласон (Jay Fenlason), Том Лорд (Tom Lord), Кен Пиццини (Ken Pizzini),
Паоло Бонзини (Paolo Bonzini), Jim Meyering и Assaf Gordon.
Домашняя страница GNU sed: <https://www.gnu.org/software/sed/>.
Справка по работе с программами GNU: <https://www.gnu.org/gethelp/>.
Сообщения об ошибках отправляйте на <bug-sed@gnu.org>.
%
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
hikkispb
Сообщения: 34
ОС: Ubuntu 14.04lts

Re: sed - как убрать пробелы, табы, переносы строк и слеши

Сообщение hikkispb »

Поясните пожалуйста значения ключей. Что такое двоеточие, я знаю только точку с запятой - для многострочных скриптов в одной строке, и что за команды *line, я думал в sed только однобуквенные команды.

Код: Выделить всё

:getline 
s/\\$//; 
T endline; 
N; 
b getline;
:endline s/\s+/ /g
Пока оставил так. Но хотелось бы на самом деле не вывода в консоль, а ввода в активную строку и ожидания Enter для исполнения. А то всё равно лишняя работа остаётся.

Код: Выделить всё

xclip -o | sed -E ':getline s/\\$//; T endline; N; b getline; :endline s/\s+/ /g' #i.m.exampl
Начинающий пингвин. Изображение
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20795
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: sed - как убрать пробелы, табы, переносы строк и слеши

Сообщение Bizdelnick »

hikkispb писал(а):
26.05.2022 20:39
Что такое двоеточие
Метка.
hikkispb писал(а):
26.05.2022 20:39
что за команды *line, я думал в sed только однобуквенные команды
Это не команды, это имена меток. Вы же использовали в своём примере метку :a, я думал, Вы в курсе, как они работают. Метки могут быть и многобуквенные, я предпочитаю такие для лучшей читаемости.
https://www.gnu.org/software/sed/manual/html_node/Branching-and-flow-control.html#Branching-and-Cycles
hikkispb писал(а):
26.05.2022 20:39
Но хотелось бы на самом деле не вывода в консоль, а ввода в активную строку и ожидания Enter для исполнения.
Как вариант, можно заменять содержимое буфера, чтобы не выделять команду ещё раз, а сразу вставить мышью: xclip -o | sed <...> | xclip
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить