尽管这个问题在几年前就被回答/接受了,但目前接受的答案只对每个字符一个字节的编码(如iso-8859-1)或可变字节字符集的单字节子集(如UTF-8中的拉丁字符)是正确的。即使使用多字节拼接,也只适用于像UTF-16这样的固定多字节编码。考虑到UTF-8正在成为一个通用的标准,并且当我们按照母语使用者的数量和this list of top 30 languages by native/secondary usage来查看这个语言列表时,有必要指出一个简单的可变字节字符友好(而不是基于字节)的技术,使用cut -c和tr/sed与字符类。 比较以下内容,由于两个常见的以拉丁语为中心的错误/关于字节与字符问题(一个是head与cut,另一个是[a-z][A-Z]与[:upper:][:lower:]):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
#!/usr/bin/env bash
function show_help()
{
IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}
e.g.
2 10 /tmp/it => extract chars 2-10 from /tmp/it
EOF
"
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`
if [ -z "$3" ]
then
dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null
fi
9条答案
按热度按时间nnvyjq4y1#
head
也可以:..将提取前100个字节并返回它们。
使用
head
的好处是tail
的语法匹配:您可以将这些合并组合起来以获得字节范围。例如,要从文件中获取 second 100字节,请使用
head
读取前200字节,然后使用tail
获取最后100字节:kkih6yb82#
可以使用dd提取任意字节块。
比如说,
将字节1235到1239从其输入复制到其输出,并丢弃其余部分。
要从标准输入中获取前五个字节,请执行以下操作:
注意,如果你想指定输入文件名,dd有老式的参数解析,所以你可以这样做:
还要注意,dd冗长地宣布了它做了什么,所以要扔掉它,做:
或
bxgwgixi3#
head:
名称
head -输出文件的第一部分
概要
head[
OPTION
].[FILE
].说明
将每个FILE的前10行打印到标准输出。对于多个FILE,在每个FILE前面都有一个标题,给出文件名。如果没有FILE,或者FILE为-,则读取标准输入。
多头期权的强制参数也是空头期权的强制参数。
-c,--bytes=
[-]N
打印每个文件的前N个字节;以'-'开头,打印每个文件的所有字节,但不包括最后N个字节zpqajqem4#
你也可以grep这行,然后像这样剪切它:
mrfwxfqh5#
head或tail也可以这样做:
头部-c X
打印文件的前X个字节(如果是UTF-16文件,则不一定是字符)。tail将做同样的事情,除了最后的X字节。
这(和削减)是便携式的。
ev7lccsx6#
这个脚本给出了来自特定行和位置的字符的确切数量,例如:
给出了第5行中的字符和第5行的字符5到8,
注:
tail -1
用于选择表头显示的最后一行。yrwegjxp7#
我知道答案是对6年前一个问题的回答...
但我找了几个小时类似的东西,然后发现:cut -c正是这样做的,还有一个额外的好处,你也可以指定一个偏移量。
cut -c 1-5将返回Hello,cut -c 7-11将返回world。不需要其他命令
wmvff8tz8#
尽管这个问题在几年前就被回答/接受了,但目前接受的答案只对每个字符一个字节的编码(如iso-8859-1)或可变字节字符集的单字节子集(如UTF-8中的拉丁字符)是正确的。即使使用多字节拼接,也只适用于像UTF-16这样的固定多字节编码。考虑到UTF-8正在成为一个通用的标准,并且当我们按照母语使用者的数量和this list of top 30 languages by native/secondary usage来查看这个语言列表时,有必要指出一个简单的可变字节字符友好(而不是基于字节)的技术,使用
cut -c
和tr
/sed
与字符类。比较以下内容,由于两个常见的以拉丁语为中心的错误/关于字节与字符问题(一个是
head
与cut
,另一个是[a-z][A-Z]
与[:upper:][:lower:]
):对此(注:这在FreeBSD上工作得很好,但是GNU/Linux上的
cut
和tr
对我来说仍然是UTF-8中的希腊语):另一个最近的答案已经提出了“cut”,但只是因为它可以用来指定任意偏移量的附带问题,而不是因为直接相关的字符与。bytes的问题
如果你的
cut
不能正确处理-c
的可变字节编码,对于“第一个X
字符”(用你的数字替换X
),你可以尝试:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
-仅限于第一行,head -n 1 | grep -E -o '^.{X}'
-仅限于第一行并链接两个命令,dd
-在其他答案中已经提出过,但确实很麻烦sed
脚本,带有滑动窗口缓冲区来处理分布在多行上的字符,但这可能比只使用dd
之类的东西更麻烦/脆弱。如果您的
tr
不能正确处理具有可变字节编码的字符类,您可以尝试:sed -E -e 's/[[:upper:]]/\L&/g
(GNU专用)mznpcxlj9#
下面是一个简单的脚本,它使用这里提到的
dd
方法进行打包:extract_chars.sh