我正在尝试迁移由许多单独的文本文件组成的数据。第一步是删除文本文件中的所有不再使用的行。这些行是键值对。我想删除文件中除带有某些键的那些行以外的所有内容。我不知道文件内键的顺序。
我要保留的密钥例如版本,日期和编号。
我找到了这个问题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
,但它会不断删除文件中的所有行。我的错误在哪里?我以为我的正则表达式错了,但是这里的错误是什么?
答案 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
字段分隔符设置为=
,并且第一个字段不得与给定的字符串匹配。