Труба в / из буфера обмена в скрипте Bash


948

Возможно ли пускать в / из буфера обмена в Bash?

Я не могу найти что-либо по трубопроводу на / из дескриптора устройства или с помощью вспомогательного приложения.

Например, если /dev/clipбы устройство связывалось с буфером обмена, мы могли бы сделать:

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard

3
Я использовал :%y+в vim, который является vim-говорить для "yank (скопировать) все строки в регистр '+' ( PRIMARYбуфер обмена X )". Вы можете заменить %диапазон, если хотите быть конкретным. Но есть три предостережения: 1. Теперь вы должны сохранить любой текст в файл, прежде чем сможете скопировать его. Это в отличие от xclipкоманды, упомянутой в ответах. 2. Если вы еще не знаете, как vim, это может быть утомительно. 3. Вы можете сделать это, только если определенная функция включена при компиляции vim. Если вы устанавливаете GVim, он должен быть включен по умолчанию как в графическом интерфейсе, так и в терминальных экземплярах vim.
Брэден Бест

1
@BradenBest вы должны поставить это в качестве ответа. Я в среде NIX и не смог установить xclip. Ваш ответ работал как шарм.
HankCa

@HankCa Хорошо, я отправил ответ . Скажи мне, что ты думаешь.
Брэден Бест

@BradenBest это очень полный ответ. Мне просто понравился :%y+тот, но хорошо, у вас есть все основы покрыты! Неплохо.
HankCa

Другой вариант: использование небольшого Perl-скрипта: установка не требуется. Смотрите мой ответ ниже .
VonC

Ответы:


865

Есть множество буферов обмена, с которыми вы можете иметь дело. Я предполагаю, что вы, вероятно, пользователь Linux, который хочет поместить материал в основной буфер обмена Windows. Обычно в буфере обмена, с которым вы хотите общаться, есть утилита, которая позволяет вам общаться с ним.

В случае X есть xclip(и другие). xclip -selection cотправит данные в буфер обмена, с которым работает Ctrl + C, Ctrl + Vв большинстве приложений.

Если вы на Mac OS X, есть pbcopy. напримерcat example.txt | pbcopy

Если вы находитесь в Linux терминальном режиме (без X) , а затем посмотреть на gpmили экран , который имеет буфер обмена. Попробуйте screenкоманду readreg.

Под Windows 10+ или cygwin используйте /dev/clipboardили clip.



24
на Windows, /dev/clipboardтакже работает для Msys / MinGW Bash Shell
Михай Ротару

71
Обратите внимание, что xclip -selection cданные будут отправляться в буфер обмена, который в большинстве приложений работает с ^ C, ^ V
Клаас ван Шельвен,

31
на более новых версиях Windows Вы можете просто использовать , clipкак это:dir | clip
maep

11
Печально, что в GNU / Linux нет такого устройства /dev/clipboard, и оно заставляет устанавливать либо xclip, либо gpm, который по умолчанию отсутствует, по крайней мере, в Kubuntu (я думаю, в большинстве других дистрибутивов тоже) .
Привет, Ангел,

282

Убедитесь, что вы используете, alias xclip="xclip -selection c" иначе вы не можете просто использовать Ctrl+, vчтобы вставить его обратно в другое место.

echo test | xclip    

Ctrl+v === test


1
Как можно было бы вставить его без этого аргумента команды?
Иона

15
xclip -selection clipboard -o
Дуг

32
так как я много перехожу между osx и linux, у меня есть следующее в моих точечных файлах. alias pbcopy="xclip -selection c" alias pbpaste="xclip -selection clipboard -o" Надеюсь, это поможет.
Дуг

15
@ApockofFork, нет xclipдобавления новой строки, echoесть. Попробуй printf test | xclip -i -selection clipboard. ( printfне добавляет новую строку, если вы не пишете 'test\n'.)
David X

7
Или используйте echo -nвместо printf.
Кристиан Питч

182

устанавливать

# You can install xclip using `apt-get`
apt-get install xclip

# or `pacman`
pacman -S xclip

# or `dnf`
dnf install xclip

Если у вас нет доступа apt-getни к pacman, ни к dnf, источники доступны на sourceforge .

Настроить

удар

В ~/.bash_aliasesдобавьте:

alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"

Не забудьте загрузить новую конфигурацию, используя . ~/.bash_aliasesили перезапустив свой профиль.

Рыба

В ~/.config/fish/config.fishдобавьте:

abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"

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

Применение

Теперь вы можете использовать setclipи getclip, например:

$ echo foo | setclip
$ getclip
foo

3
Для всех остальных дистрибутивов: вы можете скачать исходники с sourceforge.net/projects/xclip
Scz

+1 Лучшее решение! В арке sudo pacman -S xclip. Но обратите внимание, что .bashrcэто не лучшее место. Я рекомендую конечному пользователю ознакомиться с правильными файлами bashrc, bash_aliases и .profile, а также с тем, как bash обрабатывает каждый из них. Совет: вместо этого поместите его в .bash_aliases.
eduncan911

1
Спасибо @ eduncan911! :) Добавлена ​​возможность использования pacmanменеджера пакетов и удалено .bashrcпредложение. Я знаю, .bash_aliasesчто более адаптирован, но конечный результат тот же ( .bashrcпросто требует, .bash_aliasesесли он существует). Если люди хотят грязной системы, пусть она будет. :)
тлеб

@EladTabak Счастлив, что это помогло.
tleb

1
@jpaugh ты прав. мои .bashrcисточники .bash_aliasesв конце. ;) Я придерживаюсь этого старого соглашения, которое остается на 100% совместимым для всех версий Arch, Ubuntu / Debian, Raspberry, macOS / OSX и Windows Bash: stefaanlippens.net/my_bashrc_aliases_profile_and_other_stuff С этим соглашением я использую одни и те же точечные файлы на всех компьютерах. Я коснулся. Это довольно мило: github.com/eduncan911/dotfiles
eduncan911

143

На MacOS использовать встроенный pbcopyи pbpasteкоманды.

Например, если вы запустите

cat ~/.bashrc | pbcopy

содержимое ~/.bashrcфайла будет доступно для вставки с помощью ярлыка Cmd+ v.



25

xsel на Debian / Ubuntu / Mint

# append to clipboard:
cat 'the file with content' | xsel -ib

# or type in the happy face :) and ...
echo 'the happy face :) and content' | xsel -ib

# show clipboard
xsel -b

# Get more info:
man xsel

устанавливать

sudo apt-get install xsel

Чем это отличается от echo "foo" | xclip -selection c?
Лео Леопольд Герц 준영

Есть несколько ответов на этот Ask Ubuntu ответ , но , главным образом , xselи xclipэквивалентны во всех отношениях , за исключением того xclipможет считывать файлы / записи по имени, но xselтребует оболочки перенаправление , если вы хотите получить доступ к файлу.
Колин Д. Беннетт

xselработает хорошо из сценариев, а xclip работает только из командной строки. Не уверен почему.
NVRM

16

Вау, я не могу поверить, сколько есть ответов на этот вопрос. Я не могу сказать, что я пробовал их все, но я пробовал лучшие 3 или 4, и ни один из них не работает для меня. То, что сработало для меня, было ответом, находящимся в одном из комментариев, написанных пользователем по имени Дуг. Так как я нашел это очень полезным, я решил повторить в ответ.

Установите утилиту xcopy и, когда вы находитесь в Терминале, введите:

копия

Thing_you_want_to_copy|xclip -selection c

Вставить

myvariable=$(xclip -selection clipboard -o)

Я заметил много ответов, рекомендованных pbpaste и pbcopy. Если вам нравятся эти утилиты, но по какой-то причине они недоступны в вашем репо, вы всегда можете создать псевдоним для команд xcopy и назвать их pbpaste и pbcopy.

alias pbcopy="xclip -selection c" 
alias pbpaste="xclip -selection clipboard -o" 

Итак, это будет выглядеть так:

Thing_you_want_to_copy|pbcopy
myvariable=$(pbpaste)

Отлично, ваш псевдоним вполне соответствует MacOS.
MeadowMuffins

15

Ответ 2018

Используйте clipboard-cli . Он работает с macOS, Windows, Linux, OpenBSD, FreeBSD и Android без особых проблем.

Установите его с помощью:

npm install -g clipboard-cli

Тогда вы можете сделать

echo foo | clipboard

Если вы хотите, вы можете псевдоним cb, поставив его в вашем .bashrc, .bash_profileили .zshrc:

alias cb=clipboard


2
Вы уверены, что это безопасная npmупаковка?
Джонни

3
@Stas, я надеюсь, это сделано Sindresorhus ( github.com/sindresorhus ), самым плодовитым участником узла. Он отвечает за библиотеку тестирования Ava, xo linter, Yeoman и многие другие проекты. Он также отвечает за бесчисленные небольшие библиотеки, подобные этой, которые коллективно размещают свой код почти на каждом веб-сайте, использующем JS, в Интернете. Это не значит, что он не мог быть скомпрометирован; только то, что количество глаз на его репо и его собственная репутация делают его гораздо менее вероятным, чем в большинстве случайных репо npm.
Эван Конрад,

Круто! Работает на Ubuntu GNU / Linux, где xclip не работает.
Кевин Бухс

14

В подсистеме Windows для Linux вы можете скопировать в буфер обмена с помощью clip.exe.

cat file | clip.exe

Не забывайте использовать команду |pipe. И не >команда, так как это не сработает.


11

Вот готовый скрипт bash для чтения буфера обмена, который работает на нескольких платформах. Пожалуйста, отредактируйте скрипт здесь, если вы добавите функциональность (например, больше платформ).

#!/bin/bash
# WF 2013-10-04
# multi platform clipboard read access
# supports
#   Mac OS X
#   git shell / Cygwin (Windows)
#   Linux (e.g. Ubuntu)

#
# display an error
#
error() {
  echo "error: $1" 1>&2
  exit 1
}

#
# getClipboard
#
function getClipboard() {
 os=`uname`
      case $os in 
        # git bash  (Windows)
        MINGW32_NT-6.1)
          cat /dev/clipboard;;
        # Mac OS X
        Darwin*)
          pbpaste;;  
        # Linux 
        Linux*)
          # works only for X clipboard - a check that X is running might be due
          xclip -o;;
        *)
          error "unsupported os $os";;
      esac
}

tmp=/tmp/clipboard$$
getClipboard >$tmp
cat $tmp
# comment out for debugging
rm $tmp

Брю, это на самом деле работает, почему это не ответ?
255.tar.xz

9

На Windows (с Cygwin) попробуйте cat /dev/clipboardили echo "foo" > /dev/clipboardкак указано в этой статье.


1
Как пользователь @maep упомянул в отдельном комментарии, более новые версии Windows (я могу подтвердить только для Win10) могут просто перейти на clip. Я использую msysgit 1.9.5, и это сработало.
Шон Эркхарт

echo "foo" > /dev/clipboardкажется, полностью уничтожает переводы строки (не вещь \ r \ n \ n, а полностью исчезла)
user1529413

9

Только для Mac:

echo "Hello World" | pbcopy
pbpaste

Эти расположены /usr/bin/pbcopyи /usr/bin/pbpaste.


8

В Linux есть разные буферы обмена; у X-сервера есть такой, у оконного менеджера может быть другой и т. д. Стандартного устройства нет.

О, да, в CLI экранная программа также имеет свой собственный буфер обмена, как и некоторые другие приложения, такие как Emacs и vi .

В X вы можете использовать xclip .

Вы можете проверить эту тему для других возможных ответов: http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html


2
Похоже, создание / dev / clip было бы хорошим проектом для кого-то.
TED

2
Я прекрасно осведомлен о нескольких буферах обмена. Как это затрудняет ответ на мой вопрос?
Мойнудин

Было бы разумно, если бы буферы обмена были стандартизированы, вероятно, не повредило бы, если бы вы могли использовать / dev / clip1, / ​​dev / clip2 .. / dev / clip <n> для доступа к ним, единственная проблема заключается в том, что они специфичны для пользователя и устройства общесистемные. Но если вы создаете драйвер устройства ядра, который маскируется в соответствии с UID доступа, он должен работать как положено.

5

Скопируйте и вставьте в буфер обмена в Windows (Cygwin):

Видеть:

$ clip.exe -?

CLIP
Description:
    Redirects output of command line tools to the Windows clipboard.
    This text output can then be pasted into other programs.
Parameter List:
/?                  Displays this help message.
Examples:
DIR | CLIP          Places a copy of the current directory
                        listing into the Windows clipboard.
CLIP < README.TXT   Places a copy of the text from readme.txt
                        on to the Windows clipboard.

Также существуют getclip (его можно использовать вместо Shift+ Ins!) И putclip (echo oaeuoa | putclip.exe, чтобы поместить его в клип).


4

Это простой скрипт Python, который делает именно то, что вам нужно:

#!/usr/bin/python

import sys

# Clipboard storage
clipboard_file = '/tmp/clipboard.tmp'

if(sys.stdin.isatty()): # Should write clipboard contents out to stdout
    with open(clipboard_file, 'r') as c:
        sys.stdout.write(c.read())
elif(sys.stdout.isatty()): # Should save stdin to clipboard
    with open(clipboard_file, 'w') as c:
        c.write(sys.stdin.read())

Сохраните это как исполняемый файл где-то на вашем пути (я сохранил его в /usr/local/bin/clip. Вы можете передать материал, который будет сохранен в буфер обмена ...

echo "Hello World" | clip

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

clip | cowsay
 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Запуск его сам по себе просто выведет то, что находится в буфере обмена.


Это работает, когда вы находитесь на одном компьютере, но не позволит вам копировать вещи между компьютерами.
Чарльз Плагер

Кажется, только `echo str> tmpfile`, а cat tmpfileне операция с буфером обмена. // так же, как @horta ответы.
Юренчен

похоже, это не устанавливает переменную буфера обмена, поэтому я не могу вставить содержимое в другое приложение - это не настоящий буфер обмена!
Джена

4

Я нашел хорошую ссылку: /unix/69111/

В моем случае я хотел бы вставить содержимое в буфер обмена, а также посмотреть, что там вставлено, поэтому я также использовал teeкоманду с дескриптором файла:

echo "just a test" | tee >(xclip -i -selection clipboard)

>()это форма процесса замещения. bash заменяет каждый путь к дескриптору файла, который связан со стандартным вводом программы в круглых скобках.

Команда teeразветвляет вашу команду, позволяя вам «передать ее содержимое» и увидеть результат в стандартном выводе «stdout»

Вы также можете создавать псевдонимы для получения и записи в буфер обмена, что позволяет использовать «pbcopy» и «pbpaste», как если бы вы находились в MAC. В моем случае, поскольку я использую zsh, у меня есть это в моем файле псевдонимов:

(( $+commands[xclip] )) && {
    alias pbpaste='xclip -i -selection clipboard -o'
    alias pbcopy='xclip -selection clipboard'
}

(( $+command[name] ))в ЗШЕ тестов , если «имя» команды установлено в вашей системе, то оба псевдонимов сгруппированы с {}. &&двоичная И, если б то, следовательно , если у вас есть Xclip то псевдонимами будет множество.

echo "another test" | tee >(pbcopy)

Чтобы получить содержимое буфера обмена, просто введите:

pbpaste | "any-command-you-need-here"


2

Несколько программ для Windows, которые я написал несколько лет назад. Они позволяют вам выгружать, толкать, добавлять и распечатывать буфер обмена. Это работает так:

dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip

Включает в себя исходный код: cmd_clip.zip


2

Есть несколько способов. Некоторые из упомянутых способов включают (я думаю) tmux, screen, vim, emacs и оболочку. Я не знаю emacs или screen, поэтому я перейду к остальным трем.

Tmux

Хотя не в выборе X, tmux имеет режим копирования доступны через prefix-[( prefixэто Ctrl+ Bпо умолчанию). Буфер, используемый для этого режима, является отдельным и эксклюзивным для tmux, что открывает немало возможностей и делает его более универсальным, чем выбор X в нужных ситуациях.

Чтобы выйти из этого режима, нажмите q; для навигации используйте вашу vimили emacsпривязку (по умолчанию = vim), поэтому hjklдля перемещения, v/V/C-vдля выбора персонажа / линии / блока и т. д. Когда у вас есть выбор, нажмите, Enterчтобы скопировать и выйти из режима.

Чтобы вставить из этого буфера, используйте prefix-].

Ракушка

X11Кажется, что любая установка по умолчанию идет с двумя программами: xclipи xsel(вроде как и с обеими, startxи xinit). В большинстве других ответов упоминается xclip, и мне очень нравится xselза его краткость, поэтому я собираюсь осветить xsel.

Из xsel (1x) :

Варианты ввода

-a, --append

добавить стандартный ввод к выбору. Подразумевает -i .

-ф,

добавить к выбору по мере роста стандартного ввода. Подразумевает -i .

-i, --input

читать стандартный ввод в выбор.

Варианты вывода

-o, --output

запишите выбор в стандартный вывод.

Варианты действий

-c, --clear

очистить выбор. Переопределяет все параметры ввода.

-d, --delete

Запрос, чтобы текущий выбор был удален. Это не только очищает выделение, но и запрашивает программу, в которой находится выделение, об удалении выделенного содержимого. Переопределяет все параметры ввода.

Варианты выбора

-p, --primary

работать на первичном выборе (по умолчанию).

-с, --средний

оперируйте ВТОРИЧНЫМ отбором.

-b, --clipboard

работать с выбором CLIPBOARD.

И это все, что вам нужно знать. p(или ничего) для PRIMARY, sдля SECONDARY, bдля CLIPBOARD, oдля вывода.

Пример: скажем, я хочу скопировать вывод fooиз TTY и вставить его на веб-страницу для сообщения об ошибке. Для этого было бы идеально скопировать в / из сеанса TTY / X. Таким образом, вопрос становится как мне получить доступ к буферу обмена из TTY?

В этом примере мы предположим, что X-сеанс находится на дисплее :1.

$ foo -v
Error: not a real TTY
details:
blah blah @ 0x0000000040abeaf4
blah blah @ 0x0000000040abeaf8
blah blah @ 0x0000000040abeafc
blah blah @ 0x0000000040abeb00
...
$ foo -v | DISPLAY=:1 xsel -b # copies it into clipboard of display :1

Тогда я могу Ctrl-Vэто в форму, как обычно.

Теперь скажите, что кто-то на сайте поддержки дает мне команду на запуск, чтобы решить проблему. Это сложно и долго.

$ DISPLAY=:1 xsel -bo
sudo foo --update --clear-cache --source-list="http://foo-software.com/repository/foo/debian/ubuntu/xenial/164914519191464/sources.txt"
$ $(DISPLAY=:1 xsel -bo)
Password for braden:
UPDATING %%%%%%%%%%%%%%%%%%%%%%% 100.00%
Clearing cache...
Fetching sources...
Reticulating splines...
Watering trees...
Climbing mountains...
Looking advanced...
Done.
$ foo
Thank you for your order. A pizza should arrive at your house in the next 20 minutes. Your total is $6.99

Заказ пиццы кажется продуктивным использованием командной строки.

... двигаться дальше.

напор

Если скомпилировано с +clipboard(Это важно! Проверьте ваш vim --version), Vim должен иметь доступ к X PRIMARYи CLIPBOARDвыборкам. Два выбора доступны из *и +регистров, соответственно, и могут быть записаны и считаны с на досуге так же , как любой другой регистр. Например:

:%y+    ; copy/yank (y) everything (%) into the CLIPBOARD selection (+)
"+p     ; select (") the CLIPBOARD selection (+) and paste/put it
ggVG"+y ; Alternative version of the first example

Если ваша копия vim напрямую не поддерживает доступ к выборкам X, это еще не конец света. Вы можете просто использовать xselтехнику, как описано в последнем разделе.

:r ! xsel -bo ; read  (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b  ; write (w) to the stdin of    (!) `xsel -b`

Привязать пару комбинаций клавиш, и вы должны быть хорошими.


Обязательно всегда не забывайте использовать DISPLAY=при вызове приложения X из не-X среды. X-приложениям нужна DISPLAYпеременная окружения, чтобы выяснить, с каким сервером (или только один сервер обрабатывает несколько сеансов?) Они общаются. Попробуйте DISPLAY=:1 firefox(или каким бы ни был ваш идентификатор дисплея; мой просто так :1) из TTY, например.
Брэден Бест

Для меня выбор в моем окружении был :%y+в VIM.
HankCa

2

Из этой темы есть опция, которая не требует установки какого-либо gclip/ xclip/ xselстороннего программного обеспечения.

Скрипт Perl (поскольку Perl обычно всегда установлен)

use Win32::Clipboard;
print Win32::Clipboard::GetText();

Как бы я использовал это? Сохранить скрипт в PATH и передать в него? Я пытаюсь написать dropbox cli wrapper для копирования ссылок, поэтому мне просто нужно, чтобы он обрабатывал текст.
Джена


2

pbcopy встроен в OSX:

Копирование содержимого .bash_profile:

cat ~/.bash_profile | pbcopy

1

В macOS используйте pbpaste .

Например:

Обновить буфер обмена

pbpaste  | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy

1

Если вы похожи на меня и работаете на сервере Linux без привилегий root и у вас нет xclip или GPM, вы можете обойти эту проблему, просто используя временный файл. Например:

$ echo "Hello, World!" > ~/clip
$ echo `cat ~/clip`
Hello, World!

Я не вижу, как отсутствие корневых привилегий влияет на это.
Брэден Бест

3
@BradenBest Отсутствие привилегий root означает, что я не могу установить что-либо.
Орта

Но что бы вы установили? ИКС? На сервере? Если у вас нет какой-то странной службы переадресации X, я не могу понять, почему вы захотите это сделать.
Брэден Бест

@BradenBest Не уверен. Любая программа или служба позволят мне выполнить копирование.
Орта

1
Что ж, если вы используете какой-либо из X selections(что подразумевается под «буфером обмена» и любые упоминания о xclip / xsel), вам нужен активный сеанс X (и, следовательно, X-сервер), чтобы вы могли получить доступ к выбору в первое место. Чтобы понять, что я имею в виду, попробуйте запустить DISPLAY="" xselна своей локальной машине. Он выйдет из-за ошибки, будучи не в состоянии найти сеанс "", и никакое взаимодействие с любым выбором X не будет выполнено. Вот почему я изначально сказал, что не вижу, как это влияет на привилегии суперпользователя: root или нет root, вы вряд ли найдете выбор X полезным в серверной среде.
Брэден Бест




0

Хотя> через год я поделюсь несколько другим решением. Надеюсь, это кому-нибудь пригодится.

Вчера у меня возник вопрос: «Как разделить буфер обмена между различными сессиями пользователей?» , При переключении между сессиями с ctrlaltF7-ctrlaltF8 фактически, вы не можете вставить то, что скопировали.

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

user1@host:~$ mkfifo /tmp/sharedClip

затем в отправляющем терминале

user1@host:~$ cat > /tmp/sharedClip

последний, в приемном терминале:

user2@host:~$ cat /tmp/sharedClip

Теперь вы вводите или вставляете что-либо в первый терминал, и (после нажатия return ) оно сразу же появляется в принимающем терминале, откуда вы можете снова копировать / вставлять в любое удобное для вас место.

Конечно, это не просто строго берет контент из буфера обмена user1, чтобы сделать его доступным в буфере обмена user2, но требует дополнительной пары кликов Paste & Copy.


Не кажется слишком удивительным. Два разных X-сервера = два разных набора выбора. Тем не менее, вы можете настроить скрипт, который принимает ввод / вывод через xsel/xclip. Например, один конец слушает, чтобы увидеть, изменился ли какой-либо из вариантов, а затем автоматически передает его (через именованный FIFO) другому сценарию, который прослушивает один или несколько каналов, который вставляет его в свой собственный выбор X. Таким образом, копирование текста автоматически приведет к тому, что тот же текст появится в выделении другого сеанса X. И не забывайте о $DISPLAY.
Брэден Бест

0

Рубиновый лайнер вдохновил меня попробовать Python.

Скажем, мы хотим команду, которая делает отступ в любом месте в буфере обмена с 4 пробелами. Идеально подходит для обмена фрагментами на stackoverflow.

$ pbpaste | python -c "import sys
 for line in sys.stdin:
   print(f'    {line}')" | pbcopy

это не опечатка. Python нужен перевод строки для цикла for. Мы хотим изменить строки за один проход, чтобы избежать создания дополнительного массива в памяти.

Если вы не против собрать дополнительный массив, попробуйте:

$ pbpaste | python -c "import sys; print(''.join([f'    {l}' for l in sys.stdin]))" | pbcopy

но, честно говоря, awk лучше для этого, чем python. Я определил этот псевдоним в моем ~/.bashrcфайле

alias indent="pbpaste | awk '{print \"    \"\$0}' | pbcopy"

теперь, когда я запускаю indentто, что находится в моем буфере обмена, отступ.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.