如何将文本粘贴到像 awk 这样的逐行文本过滤器中,而没有标准输入回显到屏幕?

Posted

技术标签:

【中文标题】如何将文本粘贴到像 awk 这样的逐行文本过滤器中,而没有标准输入回显到屏幕?【英文标题】:how do I paste text to a line by line text filter like awk, without having stdin echo to the screen? 【发布时间】:2010-02-05 22:45:06 【问题描述】:

我在 Windows 框中的电子邮件中有一个文本,看起来像这样:

100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same

我想提取数字,即每行的第一个单词。我在我的 Linux 机器上打开了一个运行 bash 的终端...

如果这些在文本文件中,我会这样做:

awk 'print $1' mytextfile.txt

我想将这些粘贴进去,然后取出我的号码,而不创建临时文件。

我天真的第一次尝试是这样的:

$ awk 'print $1'
100 some random text
100
101 some more random text
101
102 lots of random text, all different
103 lots of random text, all the same

102
103

stdin 和 stdout 的缓冲对此进行了哈希处理。我不介意先打印所有标准输入,然后再打印所有标准输出;例如,如果我粘贴到“排序”中会发生这种情况,但 awk 和 sed 是另一回事。

多一点思考给了我这个: 打开两个终端。创建一个fifo文件。在一个终端上读取 fifo,在另一个终端上写入。

这确实有效,但我很懒。我不想打开第二个终端。当我将文本传递到管道时,shell 中有没有一种方法可以隐藏回显到屏幕的文本,以便我粘贴:

100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same

但是看到这个了吗?

$ awk 'print $1'
100
101
102
103

【问题讨论】:

【参考方案1】:

您可以使用here document。我尝试了以下方法并且成功了:

$ awk 'print $1' << END
> 100 some random text
> 101 some more random text
> 102 lots of random text, all different
> 103 lots of random text, all the same
> END
100
101
102
103

我将尝试解释我输入的内容:

awk 'print $1' << END (RETURN)
(PASTE) (RETURN)
END (RETURN)

如果有道理的话。

粘贴的文本仍会显示在标准输出上,但您关心的结果都会在之后结束,因此您可以轻松地将其取出。在我的示例中,确保选择文本中没有的内容来替换 END

【讨论】:

【参考方案2】:

也许最好的方法是在这里使用你的 shell-docs:

awk 'print $1' <<EOF
100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same
EOF
100
101
102
103

或者,您可以使用 END 块:

awk 'a[NR]=$1 ENDfor (i=1;i<=NR;i++) print a[i]'
100 some random text
101 some more random text
102 lots of random text, all different
103 lots of random text, all the same
^d
100
101
102
103

【讨论】:

【参考方案3】:

如果你像我一样设置,运行 Windows、Xming 和 PuTTY,你可以这样做:

$ xclip -i[enter]
[right-click-paste]
[ctrl-d]
$ xclip -o | awk 'print $1'

它要求您设置了 X-forwarding 并安装了xclip(可以使用xsel -ixsel -o)。

【讨论】:

这引发了我的一些头脑风暴;我想出了以下内容: smenu() ( IFS=',' ; select x in $*; do echo "$x" | xsel -i; done ) 允许这样的事情: smenu "First item to paste,Paste me #2,第三个菜单项" 1) 第一个要粘贴的项目 2) 粘贴我 #2 3) 第三个菜单项 #?在提示符处输入“3”会将“第三个菜单项”放入剪切/粘贴缓冲区。对于加速延迟点击快乐 Windows 程序中的重复数据输入非常方便。我在 commandlinefu.com 上添加了这个和你之前的建议......希望你不介意。【参考方案4】:

类似

stty -echo ; awk 'print $1' ; stty echo

可以帮到你。

【讨论】:

Michael,stty 对于 tty 是全局的,还是可以通过进程本地化? (stty -echo; awk 'print $1')

以上是关于如何将文本粘贴到像 awk 这样的逐行文本过滤器中,而没有标准输入回显到屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

如何将文本粘贴到每一行的末尾?崇高 2

来自谷歌云视觉 API OCR 的逐行数据

将按钮与换行文本并排垂直对齐

如何创建带有两行文本且第一行文本大于第二行的 UIButton?

如何在 Vim 中进行文本选择操作和使用标志

AS3:如何将数据网格中的数据保存到逐行文本文件中?