Linux cut命令 - 在多个位置之间捕获字符串

时间:2013-10-27 22:58:51

标签: linux sed cut

我有一个包含很长行的文本文件。我想通过指定几个位置来获取文件的一部分。

我试过了cut,但它似乎与我所需要的完全相反;它只捕获我不想要的东西。

我的剪切代码:

/bin/cat file.txt | /usr/bin/cut -f50-62,3414-5706427

我的预期结果是除了字符50-62和字符3414-5706427之外的整个文件。

我还想到了sed但是没有办法让sed只让我得到我需要的数据。是否有任何Linux命令可以反转结果?

3 个答案:

答案 0 :(得分:4)

编辑cut有一个选项,看起来像你想要的那样:

echo "abcdefghikjl" | cut -c2-4
bcd
echo "abcdefghikjl" | cut -c2-4 --complement
aefghikjl

否则,您可以使用原生bash string manipulation

#!/bin/bash

function revcut() { 
    echo "${1/${1:$2:$3-$2}/}"; 
}

用法:

revcut "some string" start end

来自文件:

revcut "$(cat filename)" start end

答案 1 :(得分:1)

如果您想要特定的字符,请使用-c

-f适用于您使用-d指定字段分隔符的字段

sed将为你完成这项工作:(我的算术可能有点偏差)

sed -r 's/(.{49}).{13}(.{3360}).{5703013}/\1\2/'

答案 2 :(得分:0)

目前还不完全清楚您的位置是整个文件中的字节位置,还是具有很长行的文件中的列位置(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的算术。