Я пользуюсь sed
уже довольно давно, но тут есть одна странность, с которой я не могу разобраться.
Позвольте мне объяснить мою проблему с реальным делом.
Сцена 1
printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard
В первой команде я printf
направляю вывод, чтобы xclip
он был скопирован в буфер обмена. Теперь в printf
отличие от echo
не вставляем новую строку в конец по умолчанию. Поэтому, если я вставлю этот контент в терминал, ls
скопированная команда не запустится автоматически.
Во втором - новая строка в конце, поэтому вставка содержимого буфера обмена также приводит к выполнению команды в буфере обмена.
Это нежелательно для меня. Итак, я хотел удалить новую строку с помощью sed
, но это не удалось, как объяснено в сцене ниже.
Сцена # 2
echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard
Содержимое в буфере обмена по-прежнему содержит новую строку. Когда я вставляю его в терминал, команда запускается автоматически.
Я также попытался удалить символ возврата каретки \r
. Но нада. Кажется, я упускаю что-то очень важное / основное здесь.
generate-text | xclip
случае. Этот ответ удаляет только последний перевод строки.Многие инструменты обработки текста, включая sed, работают с содержимым строки, за исключением символа новой строки. Первое, что делает sed при обработке строки, это убирает символ новой строки в конце, затем он выполняет команды в сценарии и добавляет заключительный символ новой строки при печати. Таким образом, вы не сможете удалить символ новой строки с помощью sed.
Чтобы удалить все новые строки, вы можете использовать
tr
вместо:источник
Вы можете заменить символы новой строки в sed, передав опцию -z .
Sed man page:
источник
| xclip
случае.Если вы просто помещаете команды в буфер обмена
Если вам дополнительно нужно сделать более сложные преобразования,
источник
perl
иpython
оба гораздо медленнее, чемsed
при правильном использовании. Однако научиться правильно его использовать - вот ключ.sed
могут сделать гораздо больше, чем справиться только с однострочниками, и, скорее всего, это будет быстрее, чем у любого другого инструмента, который вы упомянули.Чтобы удалить только последний символ новой строки , проложите через:
sed
не добавит a\0
к концу потока, если для разделителя задано значениеNUL
via-z
, тогда как для создания текстового файла POSIX (определяемого как конец a\n
) он всегда будет выводить финал\n
без-z
.Например:
И доказать не
NUL
добавилЧтобы удалить несколько завершающих символов новой строки , проложите через:
источник