it-swarm.cn

从管道中获取字符串的前[x]个字符

如果我从命令(单行)中得到的输出确实很长,但是我知道我只想要输出的前[x]个字符(比如8个字符),最简单的方法是什么?没有任何分隔符。

67
xenoterracide

一种方法是使用cut

 command | cut -c1-8

这将为您提供每行输出的前8个字符。由于cut是POSIX的一部分,因此它可能在大多数Unices中使用。

95
Steven D

这些是仅获取前8个字符的其他方法。

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

如果你有重击

var=$(command)
echo ${var:0:8}
26
user1606

使用 参数扩展 的另一种衬管解决方案

echo ${Word:0:x}

EG: Word="Hello world"
echo ${Word:0:3} or echo ${Word::3} 
o/p: Hel


EG.2: Word="Hello world"
echo ${Word:1:3}
o/p: ell
2
Prabhat Kumar Singh

如果您具有足够高级的Shell(例如,以下命令将在Bash中运行,不确定是否使用破折号),则可以执行以下操作:

_read -n8 -d$'\0' -r <(command)
_

执行read ... <(command)之后,您的字符将位于Shell变量REPLY中。输入_help read_以了解其他选项。

说明:read的_-n8_参数表示我们最多需要8个字符。 _-d$'\0'_说读取直到为空,而不是换行符。这样,即使较早的字符之一是换行符,读取也将继续8个字符(但如果它是null,则不是)。 _-n8 -d$'\0'_的替代方法是使用_-N8_,它只能读取8个字符或直到stdin到达EOF。没有分隔符。这可能更适合您的需求,但是我不知道有多少个外壳具有读取_-N_和_-n_和_-d_的能力。继续说明:_-r_说忽略_\_-转义,因此,例如,我们将_\\_视为两个字符,而不是单个_\_。

最后,我们使用read ... <(command)而不是_command | read ..._,因为在第二种形式中,读取是在子外壳中执行的,然后该子外壳立即退出,从而丢失了您刚刚读取的信息。

另一个选择是在子Shell中进行所有处理。例如:

_$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
_
2
dubiousjim

这是便携式的:

a="$(command)"             # Get the output of the command.
b="????"                   # as many ? as characters are needed.
echo ${a%"${a#${b}}"}      # select that many chars from $a

要构建一个可变长度的字符串,它具有 这里是它自己的问题

1
user79743

在Maven存储库中手动生成校验和文件时遇到此问题。不幸的是cut -c总是在输出末尾输出换行符。禁止使用xxd

command | xxd -l$BYTES | xxd -r

输出正好$BYTES个字节,除非command的输出短一些,否则正是该输出。

0
Krzysztof Jabłoński