regex - 删除文件中与模式不匹配的行

标签 regex bash sed

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

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

我发现了这个问题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

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

最佳答案

您可以使用

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

此处的 BRE POSIX 模式匹配

  • ^ - 行的开头
  • \(version\|date\|number\) - 组匹配
    • version - version 字符串
    • \| - 或
    • 日期 - 一个日期字符串
    • \| - 或
    • 数字 - 一个数字字符串
  • = - 一个 = 字符。

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

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

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

查看online demo .

关于regex - 删除文件中与模式不匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53225614/

相关文章:

Java RegEx 从 getter 和/或 setter 中查找变量?

linux - 使用 sed 替换 yaml 文件中的键/值

php - 在 CentOS 中设置 Crontab 以执行 PHP 脚本

Bash - 如何将参数传递给通过标准输入读取的脚本

regex - sed 和 regex 替换 ',' 除了在字符串内

regex - 打印文件直到第 N 个匹配项

正则表达式:一次性获取没有扩展名的文件名?

javascript - JavaScript 中的电话正则表达式

JavaScript 字符串仅在开头匹配与使用indexOf 比较?

regex - Salt-stack 与 Pam.d 一起工作