【问题标题】:delete lines in file not matching the pattern删除文件中与模式不匹配的行
【发布时间】:2018-11-09 12:19:53
【问题描述】:

我正在尝试迁移由许多单独的文本文件组成的数据。第一步是删除文本文件中不再使用的所有行。这些行是键值对。我想删除文件中的所有内容,除了那些带有某些键的行。我不知道文件中键的顺序。

我想保留的键是例如版本、日期和编号。

我发现了这个问题Remove all lines except matching pattern line best practice (sed) 并尝试了接受的答案。我的 sed 命令是

sed '/^(version=.*$)|(date=.*$)|(number=.*$)/!d' file.txt

在地址后面加上一个 !d 来删除所有与模式不匹配的行。

正则表达式示例:https://regex101.com/r/LKfxpP/2

但它不断删除我文件中的所有行。我的错误在哪里?我认为我的正则表达式有误,但这里的错误是什么?

【问题讨论】:

    标签: regex bash sed


    【解决方案1】:

    你可以使用

    sed '/^\(version\|date\|number\)=/!d' file.txt > newfile.txt
    

    这里的 BRE POSIX 模式匹配

    • ^ - 行首
    • \(version\|date\|number\) - 组匹配
      • version - version 字符串
      • \| - 或
      • date - date 字符串
      • \| - 或
      • number - number 字符串
    • = - = 字符。

    或者,使用通过 -E 选项启用的 POSIX ERE 语法:

    sed -E '/^(version|date|number)=/!d' file.txt > newfile.txt
    

    这里,交替运算符| 和捕获括号不需要转义。

    查看online demo

    【讨论】:

    • 感谢您的回答。不同种类的模式是我缺少的部分。 POSIX ERE 语法正是我可以使用的。
    【解决方案2】:

    使用 awk:

    awk -F= '$1 !~ /version|date|number/' file.txt
    

    字段分隔符设置为=,第一个字段不能与给定字符串匹配。

    【讨论】: