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