bash - 当您将内容通过管道传输到 echo 或 print 时,STDIN 的参数调用是什么?

标签 bash printing pipe echo

我有一些使用一系列管道创建的文本,我想使用 echo 而不是 awk 进一步操作它。

说我有:

a chain | of | commands | producing |stream | of text

产量:

line 1 text
line 2 text
line 3 text

但是如果我想使用 echo 来做这样的事情:

a chain | of | commands | producing |stream | of text | echo ${STDIN%text}

要在它说的那一行之后切断所有文本,我将如何引用它来获得预期的结果:

line 1 
line 2 
line 3

最佳答案

虽然申请 parameter expansions 会很方便例如 ${var%text}stdin 输入,shell 不支持 - 顾名思义,参数扩展仅限于参数(变量)

虽然您可以将您的命令通过管道传递给 while IFS= read -r line ... 循环并在 ${ 的循环体中执行扩展行,这样的方法会(而且冗长)。

因此,外部工具是最好的选择,例如sed:

cat <<<$'line 1 text\nline 2 text\nline 3 text' | sed 's/text$//'

上述 sed 命令的作用与您的参数扩展完全相同。
如果您还想修剪“文本”之前的空格:sed 's/text$//'
修剪可变数量的空格,包括无:sed 's/*text$//'
要修剪可变数量的空格,但至少 1 个:sed 's/\{1,\}text$//'

  • (基本)正则表达式 text$ 匹配任何以 ($) text 结尾的行。

  • s/...// 然后用空字符串(空字符串)替换匹配的部分,有效地删除 text 后缀。


sjsam's helpful answer显示基于 awk 的替代方案。

关于bash - 当您将内容通过管道传输到 echo 或 print 时,STDIN 的参数调用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38669900/

相关文章:

c - 写入标准输出时如何在管道中转换为大写

linux - Grep-ing 同时保持第一行

linux - 链式 && 和 || bash 脚本中的运算符

bash - 使用系统执行某些操作时如何防止代码注入(inject)?

用于在穿孔卡片上打印的 CSS

html - 打印网页时在 CSS 中指定物理尺寸(例如 2 英寸)

打印 Canvas

bash - 在 Windows 10 上的 ubuntu 上使用 bash 启用 vi 鼠标滚轮滚动

node.js - 什么是Electron中ctrl + c的bash脚本等效?

mysql - Bash:使失败的 zip 变得冗长