我有一些使用一系列管道创建的文本,我想使用 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/