Копипаст многих строк в одну


FrBrGeorge аватар

FrBrGeorge - Posted on 30 Сентябрь 2015

Многострочный текст можно добавить в командную строку, поставив вместо него `cat`.

Иногда нужно вставить в командную строку какой-то текст, а он — не в строчку, а в одну или несколько колонок (в примере — запуск find и rm, но часто бывает. что нужный кусок текста нельзя получить командой, годится только copy+paste).

$ find . -size 0 # вывод, который мы скопируем
./dir/usr/share/doc/temporary.file
./dir/var/log/unsupported.log
./catalog/subdir/junk
./zerofile

Далее в примерах в место, отмеченное «», скопируем содержимое. Обычный copy+paste (напоминаю: в X11 работает средняя кнопка!) приведёт к тому, что после первой строки команда выполнится, а все остальные строки будут восприняты как «команда+параметры»

rm … 
 
$ rm ./dir/usr/share/doc/temporary.file
$ ./dir/var/log/unsupported.log
bash: ./dir/var/log/unsupported.log: Отказано в доступе
$ ./catalog/subdir/junk
bash: ./catalog/subdir/junk: Отказано в доступе
$ ./zerofile
bash: ./zerofile: Отказано в доступе

Ну конечно, первый файл удалился, но остальное…

Забрать вывод в кавычки тоже не поможет — нам же нужно несколько файлов, а не один с извращённым именем:

rm "…
"
 
$ rm "./dir/usr/share/doc/temporary.file
> ./dir/var/log/unsupported.log
> ./catalog/subdir/junk
> ./zerofile
> "
rm: невозможно удалить «./dir/usr/share/doc/temporary.file\n./dir/var/log/unsupported.log\n./cata...

Можно, конечно, предварительно этот текст преобразовать с помощью tr, примерно так

$ tr '\n' ' '
…
^D
./dir/usr/share/doc/temporary.file ./dir/var/log/unsupported.log ./catalog/subdir/junk ./zerofile

Потом эту строчку отметить и уже её скопировать.

Тогда вообще можно ничего повторно не копипастить, а использовать подстановку на месте:

$ rm `tr '\n' ' '`
…
^D

Но тут до нас доходит, что именно для подстановки никакое преобразование не нужно!

$ rm `cat`
…
^D

Пояснение: на самом деле символ перевода строки — такой же разделитель, как и пробел или табуляция, просто оболочка его воспринимает как управляющий. А результат подстановки только разбивается на слова, управляющий символы в нём не распознаются.

Недостаток: если в самих именах объектов имеются пробелы, они распадутся на части, и конструкция на них не заработает.

0
Ваша оценка: Ничего

хорошие типс. конкретно в этом примере можно было бы обойтись xargs

$ find . -size 0 | xargs rm

Но твой типс может пригодиться если копировал блочным выделением обрезая часть пути. или еще что :)

А еще у меня в urxvt добавлен пункт в пользовательское меню (что вызывается по ctrl-правый-клик)
"remove new lines and/or squeeze spaces". В ~/.Xresources

URxvt.perl-eval:   push @{ $urxvt::TERM->{selection_popup_hook} }, \n\
    sub { /\n/ || /\\s\\s+/ ? ("remove new lines and/or squeeze spaces" => sub { s{\n}{}g; s{\\s\\s+}{ }g }): () }, \n\
;

Перегружаем терминал, выделяем несколько строк, жмём ctrl-правый-клик, выбираем этот пункт меню. После этого в буфере большая строка.

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.