Передача команд, измените запись stdin в stdout

8
echo Hello World | nano - | less

Я хочу изменить Hello -> Goodbye в текстовом редакторе.

Это не должно быть с нано. Я застрял с нано чтения стандартного ввода, но требует, чтобы я записал в файл (запись в - создает файл с именем -)

user65660
источник
@slm, я думаю, что было бы более разумно закрыть другой Q как обман, так как этот - более широкий случай.
Грэм
@ Грэм - я бы с тобой согласился, но у другого тоже есть твой ответ, хотя и не так хорошо написано. Некоторое слияние может быть более подходящим. Может быть, мы должны заручиться помощью мода, чтобы помочь с этими 2? Я пинг один об этом.
SLM
@slm, я думаю, что мы можем оставить это тому, кто проходит через близкую очередь и позволить толпе решать. Основное отличие, как я вижу, состоит в том, что другой Q - это особый случай, когда вам нужен только один конец канала.
Грэм
1
@Graeme - если мы не заправим насос на нем, то, скорее всего, ppl закроет новее для старшего как дупла.
SLM

Ответы:

11

Пакет moreutils имеет отличную команду для этого, называется vipe. Со страницы руководства:

SYNOPSIS
       command1 | vipe | command2

DESCRIPTION
       vipe allows you to run your editor in the middle of a unix pipeline and
       edit the data that is being piped between programs. Your editor will have
       the full data being piped from command1 loaded into it, and when you close
       it, that data will be piped into command2.

По умолчанию используется editorкоманда, которая обычно является символической ссылкой на редактор командной строки по умолчанию. Вы можете изменить это, изменив ссылку (используйте update-alternativesв системах на основе Debian) или используя EDITORпеременную окружения. Например, вы могли бы сделать:

echo Hello World | EDITOR=nano vipe | less

В противном случае, если конкретный текстовый редактор не имеет поддержки для такого рода вещей, я думаю, что вы застряли с созданием временного файла вручную, записав файл в него, запустив редактор, введя файл в остальную часть конвейера и удаление временного файла. Команда в vipeосновном позаботится обо всем этом. Это хорошо, но команда редко доступна по умолчанию.

Graeme
источник
1

Текстовый редактор joe (он же редактор Joe's ) делает то, что вы хотите.

Команда echo "hello world" | joe - | lessработает как положено, хотя по какой-то причине ей нужны кавычки.

Некоторые команды (например, gpg) выводят вывод, который не попадает в канал. Это портит начальный экран внутри joe, но нажатие ctrl + r - refresh - очистит все.

Бен Теш
источник
1

Если все, что вам нужно, это заменить «Hello» на «Goodbye» (или любую другую замену слов), вы можете избежать ручного редактирования в редакторе в пользу инструмента автоматического поиска и замены. Например, «sed» может делать такие замены, как это:

echo Hello World | sed 's/Hello/Goodbye/' | less

Проверьте "man sed" для более подробной информации.

ElazarR
источник