当您将内容传送到 echo 或打印时,STDIN 的参数调用是什么?



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

虽然将参数扩展(如${var%text})应用于stdin输入会很方便,但shell不支持这一点-顾名思义,参数扩展仅限于参数(变量)

虽然可以将命令管道传输到while IFS= read -r line ...循环,并在${line}上的循环体中执行扩展,但这种方法将是缓慢(而且冗长)。

因此,外部实用程序是此处的最佳选择,例如sed:

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

上述sed命令的作用与参数展开的作用完全相同。
如果您还想修剪"text"之前的空格:sed 's/ text$//'
修剪可变数量的空格(不包括空格):sed 's/ *text$//'
修剪可变数量的空格,但至少为1:sed 's/ {1,}text$//'

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

  • s/...//然后将匹配的部分替换为空(空字符串),从而有效地去除了text后缀。


sjsam的有用答案显示了一个基于awk的替代方案。

像awk这样的工具最适合您的场景:

a chain | of | commands | awk '{sub(/[[:blank:]]*text$/,"")}1'

sub默认作用于整个记录$0,并将保留检索到的文本中的空格/制表符的数量。


需要更多关于awk的信息吗?检查[这个]

最新更新