我有一些使用管道串创建的文本,我想使用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的信息吗?检查[这个]