linux中有没有像
cat
这样的命令可以从文件中返回指定数量的字符?
例如,我有一个文本文件,例如:
Hello world
this is the second line
this is the third line
我想要返回前 5 个字符的东西,即“hello”。
谢谢
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
您可以将它们组合起来以获得字节范围。例如,要从文件中获取第 100 个字节,请使用 head
读取前 200 个字节,然后使用
tail
获取最后 100 个字节:head -c 200 file | tail -c 100
例如,
dd skip=1234 count=5 bs=1
会将字节 1235 到 1239 从其输入复制到其输出,并丢弃其余部分。
要从标准输入获取前五个字节,请执行以下操作:
dd count=5 bs=1
注意,如果你想指定输入文件名,dd 有老式的参数解析,所以你会这样做:
dd count=5 bs=1 if=filename
还要注意 dd 详细地宣布了它所做的事情,所以要抛弃它,请执行以下操作:
dd count=5 bs=1 2>&-
或
dd count=5 bs=1 2>/dev/null
grep 'text' filename | cut -c 1-5
头-c X
打印文件的前 X 个字节(如果是 UTF-16 文件则不一定是字符)。 tail 也会做同样的事情,除了最后 X 个字节。
这个(和切割)是便携式的。
此脚本给出了特定行和位置的确切字符数,例如:
head -5 tst.txt | tail -1 |cut -c 5-8
给出第 5 行中的字符以及第 5 行的第 5 到 8 个字符,注
:tail -1
用于选择头部显示的最后一行。
但是我花了几个小时寻找类似的东西,然后发现:
cut -c正是这样做的,还有一个额外的好处,您还可以指定偏移量。
cut -c 1-5将返回 Hello 和 cut -c 7-11 将返回 world。不需要任何其他命令
和按母语/次要使用情况列出的前 30 种语言列表时,这一点非常重要指出一种简单的可变字节字符友好(不是基于字节)技术,使用 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]]
对此(注意:这在 FreeBSD 上工作得很好,但 GNU/Linux 上的
cut
和
tr
对我来说仍然在 UTF-8 中破坏了希腊语):$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
另一个更新的答案已经提出了“cut”,但只是因为它可以用于指定任意偏移量的附带问题,而不是因为直接相关的字符与字节问题。如果您的
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
dd
方法进行总结:
extract_chars.sh#!/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