【问题标题】:deleting all lines that don't match a pattern with sed使用 sed 删除与模式不匹配的所有行
【发布时间】:2016-05-30 23:47:23
【问题描述】:

我有一个文件tmpFile 包含:

wqf____32qwfe
123412
qqwef123414
12039421
...

tmpFile 中,有些行只包含数字,或者可以包含任何类型的字符。

我想保留只包含整数的行。 我怎样才能做到这一点?

【问题讨论】:

    标签: bash sed grep


    【解决方案1】:

    虽然您可以为此使用 sed,但工作是 G局部搜索 R常规 Expression 和 P 看看结果,猜猜我们发明了什么工具来完成这项工作?

    使用 GNU grep 打印仅包含数字的行是:

    grep -E '^[0-9]+$' file
    

    或使用任何 grep:

    grep '^[0-9][0-9]*$' file
    

    打印包含非数字的行:

    grep '[^0-9]' file
    

    打印不包含数字的行(包括空行):

    grep -v '[0-9]' file
    

    打印不包含非数字的行(包括空行):

    grep -v '[^0-9]' file
    

    【讨论】:

    • 是的,非常有趣,这似乎是我真正想做的事情。 grep -E '^[0-9]+$' tmpFilegrep '^[0-9][0-9]*$' tmpFile 为我想做的事工作!谢谢
    【解决方案2】:
    sed '/^[0-9]\+$/!d' tmpFile
    

    ! 反转逻辑。请注意,\+ 不是 POSIX 兼容版本的 sed(例如 BSD 或 Mac OS X sed)的基本功能的一部分。

    sed '/^[0-9]\{1,\}$/!d' tmpFile
    

    这可以工作,寻找一个或多个数字。

    还有其他方法可以达到相同的整体效果,尤其是在这种有限的情况下。如果您需要将此作为更大脚本的一部分,这就是您要求的直接答案。

    【讨论】:

    • 同样可以通过重复模式/^[0-9][0-9]*$/!d进行归档
    【解决方案3】:

    您可以抑制打印模式空间,只打印与数字模式匹配的行,例如:

    $ sed -n '/^[0-9]\+$/p' file
    123412
    12039421
    

    【讨论】: