【问题标题】:Linux cut command - capture string between multiple positionsLinux cut命令 - 在多个位置之间捕获字符串
【发布时间】:2013-11-06 15:03:45
【问题描述】:

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

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

我的剪切代码:

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

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

我也想过sed,但没有办法让sed 只为我提供我需要的数据。是否有任何 Linux 命令可以反转结果?

【问题讨论】:

    标签: linux sed cut


    【解决方案1】:

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

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

    sed 会为你完成这项工作:(我的算术可能有点不对)

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

    【讨论】:

    • 感谢 glenn,-c 确实有意义,但我的问题的主要部分是如何获取不在指定范围内的值。
    【解决方案2】:

    编辑: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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2019-06-24
        • 2020-03-23
        • 2023-03-18
        相关资源
        最近更新 更多