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

时间:2018-11-09 12:19:54

标签: regex bash sed

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

我要保留的密钥例如版本,日期和编号。

我找到了这个问题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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用awk:

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

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