使用管道和标准输入的Bash子字符串

17
我的目标是将命令的输出截断到任意数量的字符(让我们使用6)。 我希望能够将此命令附加到管道的末尾,因此它应该能够只使用stdin。
echo "1234567890" | your command here 
# desired output: 123456

我查看了 awk,同时也注意到 bash 有一个 substr 命令,但是我想出的两种解决方案似乎比必要的长度更长,并且我感觉可能还有更简单的方法。

我将把我发现的两个解决方案发布为答案,欢迎评论和新的解决方案!


已找到解决方案,感谢所有回答的人!

在 jcollado 和 Mithrandir 之间选择很难 - 我将来可能会同时使用两者。 Mithrandir 的答案是一个实际的子字符串(substring),更容易查看结果,但 jcollado 的答案让我无需 EOL 字符就可以将其管道传输到剪贴板中。

5个回答

36

你是否想要像这样的东西:

echo "1234567890" | cut -b 1-6

1
太好了,谢谢。我知道我漏掉了什么。为了纪念和娱乐,我还会发布我的其他尝试。 - Nick Knowlson
3
你的直觉回答:“我的目标是削减...”真有趣。 - TWiStErRob

6

那使用 head -c/--bytes 呢?

$ echo t9p8uat4ep | head -c 6
t9p8ua

谢谢,这也很好!事实上,它甚至更好,因为它不包括 EOL 字符。 - Nick Knowlson

5
我想到了以下内容:
echo "1234567890" | ( read h; echo ${h:0:6} )

and

echo "1234567890" | awk '{print substr($0,1,6)}'

但两者似乎都像是我在用大锤子敲钉子。

第一个例子中的意思是 |(读取 h; echo ${h:0:6})吗? - Sirex
老实说,我真的记不清了。我现在再试一下,在zsh中两种方式都可以工作,但在bash中似乎只能用括号的方式。所以我猜可能是这样,谢谢! :) - Nick Knowlson

2
这可能适用于您:
printf "%.6s" 1234567890
123456

0
如果your_command_herecat
% OUTPUT=t9p8uat4ep
% cat <<<${OUTPUT:0:6}
t9p8ua

唯一的问题是我想要一个可以附加到管道末尾的东西,能够直接使用stdin。我会编辑问题以使其更清晰明了。 - Nick Knowlson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接