【问题标题】:Delete lines where 3rd character equals a number删除第三个字符等于数字的行
【发布时间】:2016-01-12 19:25:19
【问题描述】:

我有一个与数字一致的文件

0123456
0234566
.
.
.
etc

使用 bash 工具,命令行更可取,如果第三个数字等于 2,我如何删除每一行。

例如,使用cut -c3 我可以获得正确的数字,但我无法将它与sed 或类似的东西有效地结合起来。我不是在寻找模式,只是在寻找第三位数字。

(我已经在 python 的脚本中完成了它,但我想知道它是如何通过单行 bash 命令完成的)。谢谢!

编辑:另外,如果我想删除第三个数字不等于2 的行(相反的问题)

【问题讨论】:

    标签: bash pattern-matching cut


    【解决方案1】:

    你可以用sed做到这一点

    sed -i '/^..2/d' file
    

    如果你想做相反的事情,你可以这样做:

    sed -i '/^..[^2]/d' file
    

    因为你正在处理一个特定的角色。

    【讨论】:

    • 你的答案就是我要找的,如果可能的话,你能检查一下编辑并添加一个类似风格的答案吗?
    • @thahgr 你可以使用sed -n '/^..2/p' file
    • @thahgr 我用你的输入测试了它,使用 GNU sed v4.2.2 并且它似乎工作,即使使用 --posix 选项。不知道为什么它在您的系统上不起作用。
    【解决方案2】:

    我会使用awk:

    $ awk -F "" '$3!=2' file
    0234566
    

    通过将字段分隔符设置为""(为空,仅在 GNU-awk 上有效),每个字符都存储在不同的字段中。然后,$3 != 2 检查第三个字符是否不是 2,如果是,则打印该行。

    或者使用纯 bash,使用 Using shell parameter expansion ${parameter:offset:length}

    while IFS= read -r line
    do
       [ "${line:2:1}" != "2" ] && echo "$line"
    done < file
    

    【讨论】:

    • 对于 Bash 解决方案,测试可以写成[[ $line != ??2* ]]
    猜你喜欢
    • 2021-11-20
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2022-06-13
    • 1970-01-01
    • 2014-03-21
    • 2012-10-01
    相关资源
    最近更新 更多