我有一个文本文件要输出到我的 shell 脚本中的一个变量。但是,我只需要前 50 个字符。
我试过使用,cat ${filename} cut -c1-50但我得到的远远超过前 50 个字符?这可能是由于cut寻找行(不是 100% 确定),而此文本文件可能是一个长字符串——这确实取决于。
是否有一个实用程序可以让我通过管道从cat命令中获取前 X 个字符?
Dis*_*ame 94
head -c 50 file
Run Code Online (Sandbox Code Playgroud)
这将返回前 50 个字节。
请注意,该命令并不总是在所有操作系统上实现相同。在 Linux 和 macOS 上,它的行为是这样的。在 Solaris (11) 上,您需要使用 /usr/gnu/bin/ 中的 gnu 版本
ter*_*don 36
cut如果您使用管道将数据传递给它,您的命令将起作用:
cat ${file} | cut -c1-50
Run Code Online (Sandbox Code Playgroud)
或者,避免无用地使用 cat 并使其更安全:
cut -c1-50 < "$file"
Run Code Online (Sandbox Code Playgroud)
请注意,上面的命令将打印每个输入 line的前 50 个字符(或字节,取决于您的cut实现)。如果像您所说的那样,您的文件是一大行,它应该按照您的预期执行。
dd status=none bs=1 count=50 if=${filename}
Run Code Online (Sandbox Code Playgroud)
这将返回前 50 个字节。
到目前为止,大多数答案都假定 1 个字节 = 1 个字符,如果您使用的是非 ASCII 语言环境,则情况可能并非如此。
一个稍微更健壮的方法来做到这一点:
testString=$(head -c 200 < "${filename}") &&
printf '%s\n' "${testString:0:50}"
Run Code Online (Sandbox Code Playgroud)
请注意,这假设:
ksh93, bash(或最近的zshor mksh(尽管唯一支持的多字节字符集mksh是 UTF-8 并且仅在 之后set -o utf8-mode))和head支持的版本-c(现在大多数都这样做,但不是严格标准)。locale charmap并file -- "$filename"检查);如果没有,请使用 ie 进行设置。LC_ALL=en_US.UTF-8)head假设最坏的情况是 UTF-8,其中所有字符最多编码为 4 个字节,我使用了文件的前 200 个字节。这应该涵盖我能想到的大多数情况。