Linux命令(如猫)读取指定数量的字符
有没有像Linux中的cat
可以从文件返回指定数量的字符的命令?
例如,我有一个文本文件,如:
Hello world this is the second line this is the third line
而我想要的东西,将返回前5个字符,这将是“你好”。
谢谢
head
也是:
head -c 100 file # returns the first 100 bytes in the file
将提取前100个字节并返回。
使用head
的好处在于tail
匹配的语法:
tail -c 100 file # returns the last 100 bytes in the file
你可以使用dd来提取任意的字节块。
例如,
dd skip=1234 count=5 bs=1
将从input到输出复制字节1235到1239,并丢弃其余部分。
要从标准input中获得前五个字节,请执行:
dd count=5 bs=1
请注意,如果你想指定input文件名,dd有老式的参数parsing,所以你会这样做:
dd count=5 bs=1 if=filename
还要注意的是,dd详细地宣布它做了什么,所以把它扔掉,做:
dd count=5 bs=1 2>&-
要么
dd count=5 bs=1 2>/dev/null
头 :
名称
头部 – 输出文件的第一部分
概要
头 [ 选项 ] … [ 文件 ] …
描述
将每个FILE的前10行打印到标准输出。 有多个文件,每个文件名前面都有一个标题。 如果没有FILE,或者FILE是 – 读取标准input。
长选项的强制性参数也是短期选项的强制性参数。
-c ,– bytes = [ – ] N打印每个文件的前N个字节; 用“ – ”开头,打印每个文件的最后N个字节
head -Line_number file_name | tail -1 |cut -c Num_of_chars
这个脚本给出了特定行和位置的确切字符数,例如:
head -5 tst.txt | tail -1 |cut -c 5-8
第5行的字符和第5行的字符5至8,
注意 : tail -1
用于select头部显示的最后一行。
头部或尾部也可以做到这一点:
头-c X
打印文件的前X个字节(不一定是字符,如果它是UTF-16文件的话)。 除了最后的X字节之外,尾部也会这样做。
这(和削减)是便携式的。
你也可以把这条线弄出来然后像下面这样剪掉它:
grep'text'文件名| 切-c 1-5
我知道答案是回答6年前问的问题
但是我正在寻找类似的东西几个小时,然后发现: cut -c完全是这样,还有一个额外的好处,你也可以指定一个偏移量。
cut -c 1-5将返回你好 , 切-c 7-11将返回世界 。 不需要任何其他命令
尽pipe多年前这已被回答/接受,但目前接受的答案仅适用于每字符一个字节的编码,如iso-8859-1,或者可变字节字符集的单字节子集(如拉丁字符在UTF-8内)。 即使使用多字节拼接,也只能用于固定多字节编码,如UTF-16。 鉴于现在UTF-8正在成为一种通用标准,并且在按照母语人群和本地/次要使用情况排列的前30种语言列表中查看这些语言列表时 ,重要的是要指出简单的可变字节友好字符(不是基于字节的)技术,使用cut -c
和tr
/ sed
以及字符类。
比较由于两个常见的以拉丁语为中心的错误/关于字节和字符问题的假设(一个是head
对cut
,另一个是[az][AZ]
vs. [:upper:][:lower:]
):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \ $ head -c 1 | \ $ sed -e 's/[AZ]/[az]/g' [[unreadable binary mess, or nothing if the terminal filtered it]]
(注意:在FreeBSD上这样工作得很好,但是GNU / Linux上的cut
& tr
仍然以UTF-8格式破坏了希腊语):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \ $ cut -c 1 | \ $ tr '[:upper:]' '[:lower:]' π
另一个更近的答案已经提出了“剪切”,但只是因为它可以用来指定任意偏移量的问题,而不是由于直接相关的字符和字节问题。
如果你的cut
不能正确处理-c
和可变字节编码,那么对于“第一个X
字符”(用你的编号replaceX
),你可以试试:
-
sed -E -e '1 s/^(.{X}).*$/\1/' -eq
–sed -E -e '1 s/^(.{X}).*$/\1/' -eq
– 尽pipe限于第一行 -
head -n 1 | grep -E -o '^.{X}'
head -n 1 | grep -E -o '^.{X}'
– 只限于第一行,并链接两个命令 -
dd
– 这在其他答案中已经提出,但是真的很麻烦 - 一个复杂的
sed
脚本与滑动窗口缓冲区来处理字符分布在多行,但是这可能比只使用类似dd
更麻烦/脆弱
如果你的tr
没有正确处理带有可变字节编码的字符类,你可以尝试:
-
sed -E -e 's/[[:upper:]]/\L&/g
(GNU特定的)
这是一个简单的脚本,使用这里提到的dd
方法来包装:
extract_chars.sh
#!/usr/bin/env bash function show_help() { IT=" extracts characters X to Y from stdin or FILE usage: XY {FILE} eg 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