管道命令,修改stdin写入stdout


8
echo Hello World | nano - | less

我想在文本编辑器中修改Hello->再见。

它不必与nano一起使用。我被nano读取stdin困扰,但要求我写入文件(写入-创建名为-的文件)


这也与以下内容有关:从curl到sh(curl -s url | sh)
slm

@slm,我认为关闭另一个Q作为此值的重复是更有意义的,因为这个是更广泛的情况。
Graeme 2014年

@Graeme-我倾向于同意你的意见,但另一个人也有你的答案,尽管写得不好。一些合并可能更合适。也许我们应该争取一个mod的帮助来帮助这两个?我将对此进行ping操作。
slm

@slm,我认为我们可以将它留给正在排队的人,然后让人群决定。我看到的主要区别是另一个Q是这种情况的特例,您只需要管道的一端。
Graeme 2014年

1
@Graeme-如果我们不给泵加注,则ppl可能会将新产品关闭,将旧产品关闭。
slm

Answers:


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命令基本上会处理所有这一切。很好,但是默认情况下该命令很少可用。


1

文本编辑器joe(又名Joe的Own Editor)可以满足您的需求。

echo "hello world" | joe - | less尽管由于某些原因需要使用引号,该命令仍可按预期运行。

某些命令(例如gpg)产生的显示输出不会进入管道。这会破坏joe内部的初始显示,但是按ctrl + r(刷新)会清除内容。


1

如果只想将“ Hello”替换为“ Goodbye”(或其他任何单词替换),则可以避免在编辑器中进行手动编辑,而无需使用自动搜索和替换工具。例如,“ sed”可以这样替换:

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

检查“ man sed”以获取更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.