Comandos de tubulação, modifique stdin write para stdout

8
echo Hello World | nano - | less

Quero modificar Olá -> Adeus enquanto estiver no editor de texto.

Não precisa ser com nano. Estou preso com o nano reading stdin, mas exigindo que eu escreva em um arquivo (gravar em - cria um arquivo chamado -)

user65660
fonte
@ SLM, acho que faz mais sentido fechar o outro Q como um burro disso, já que este é o caso mais amplo.
Graeme
@ Graeme - Eu tenderia a concordar com você, mas o outro também tem a sua resposta, embora não tão bem escrito. Algumas mesclagens podem ser mais adequadas. Talvez devêssemos contar com a ajuda de um mod para ajudar com estes 2? Vou dar um ping nele.
Slm
@ slm, acho que podemos deixar para quem está passando pela fila fechada e deixar a multidão decidir. A principal diferença, a meu ver, é que o outro Q é um caso especial disso em que você deseja apenas uma extremidade do tubo.
Graeme
1
@ Graeme - se não acionarmos a bomba nela, as pessoas provavelmente fecharão o mais novo ao mais velho como um dup.
Slm

Respostas:

11

O pacote moreutils tem um ótimo comando para fazer isso, chamado vipe. Na página do manual:

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.

Por padrão, isso usará o editorcomando, que geralmente é apenas um link simbólico para o editor de linha de comando padrão. Você pode mudar isso alterando o link (usado update-alternativesem sistemas baseados no Debian) ou usando a EDITORvariável ambiental Por exemplo, você poderia fazer:

echo Hello World | EDITOR=nano vipe | less

Caso contrário, se o editor de texto específico não tiver suporte para esse tipo de coisa, acho que você está preso à criação manual de um arquivo temporário, gravando o arquivo, executando o editor, inserindo o arquivo no restante do pipeline e removendo o arquivo temporário. O vipecomando basicamente cuida de tudo isso. Isso é legal, mas o comando raramente está disponível por padrão.

Graeme
fonte
1

O editor de texto joe (aka Joe's Own Editor ) faz o que você deseja.

O comando echo "hello world" | joe - | lessfunciona conforme o esperado, embora precise de aspas por algum motivo.

Alguns comandos (como gpg) produzem uma saída exibida que não entra no canal. Isso corrompe a exibição inicial dentro de joe, mas pressionar ctrl + r - refresh - limpará as coisas.

Ben Tesch
fonte
1

Se tudo o que você deseja é substituir "Olá" por "Adeus" (ou qualquer outra substituição de palavra), você pode evitar a edição manual em um editor em favor da ferramenta de pesquisa e substituição automática. Por exemplo, "sed" pode fazer substituições como esta:

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

Verifique "man sed" para mais detalhes.

ElazarR
fonte