我有一个包含很长行的文本文件。我想通过指定几个位置来获取文件的一部分。
我试过cut
了,但它似乎正好与我需要的相反;它只捕获我不想要的东西。
我的剪切代码:
/bin/cat file.txt | /usr/bin/cut -f50-62,3414-5706427
我的预期结果是除了字符 50-62 和字符 3414-5706427 之外的整个文件。
我也想过,sed
但没有办法让sed
我得到我需要的数据。是否有任何 Linux 命令可以反转结果?
编辑:有一个选项cut
看起来像你想要的:
echo "abcdefghikjl" | cut -c2-4
bcd
echo "abcdefghikjl" | cut -c2-4 --complement
aefghikjl
否则,您可以使用本机 bash字符串操作:
#!/bin/bash
function revcut() {
echo "${1/${1:$2:$3-$2}/}";
}
用法:
revcut "some string" start end
从一个文件:
revcut "$(cat filename)" start end
如果您想要特定的字符,请使用-c
-f
适用于您指定字段分隔符的字段-d
sed
会为你做这项工作:(我的算术可能有点不对劲)
sed -r 's/(.{49}).{13}(.{3360}).{5703013}/\1\2/'
尚不清楚您的位置是整个文件中的字节位置,还是行很长的文件中的列位置(3 KB 的行不常见,更不用说 5 MB)。
但是,您可以使用以下方法处理选择长行信息cut
:
cut -c 1-49,63-3413,5706428- # character positions in each line
cut -c 1-49,63-3413,5706428- # byte positions in each line
如果您使用 UTF-8 作为代码集(并且文件中的任何字符都不在 UTF-8 的 ASCII 子集中),那么字节和字符之间的区别很重要。
如果您正在处理文件中的位置,那么您的选择会更加有限。大多数 Unix 实用程序都基于行而不是其他任何东西。一个笨拙的选择是dd
命令:
{
dd if=file bs=1 offset=0 count=49 # 1-49
dd if=file bs=1 offset=63 count=$((3414-63)) # 63-3413
dd if=file bs=1 offset=5706428 # 5706428-EOF
} > output
您可能需要调整数字以补偿基于 0 与基于 1 的算术。