使用 sed 删除以“string1”开头且不包含“string2”的行

使用 sed 删除以“string1”开头且不包含“string2”的行

我想删除一个包含超过 100K 行数据的文件中的某些行。

我只想删除以 开头MX且不包含 单词的行sum。如何使用 来实现sed

原始文件内容:

原始文件内容

预期文件内容:

预期文件内容

答案1

根据文章中提供的示例sed- 25 个删除文件中的一行或一个模式的示例我们可以编写这个命令:

sed '/^MX/{/sum/!d}' in-file            # just output the result
sed '/^MX/{/sum/!d}' in-file -i.bak     # change the file and create a backup copy
sed '/^MX/{/sum/!d}' in-file > out-file # create a new file with different name/path

这是perl解决方案 -来源

perl -ne '/^MX((?!sum).)*$/ || print' in-file
perl -ne '/^MX((?!sum).)*$/ || print' in-file > out-file

相同的正则表达式将适用于grep -P(更多解释)但是,上面的结构字面意思是如果不是则打印,为了保留匹配行的输出,grep我们需要以下-v选项:

grep -vP '^MX((?!sum).)*$' in-file
grep -vP '^MX((?!sum).)*$' in-file > out-file

这也是awk解决方案:

awk  '! /^MX/ || /sum/ {print}' in-file
awk  '! /^MX/ || /sum/ {print}' in-file > out-file

使用在线工具编写正则表达式相对容易,因为regextester.com

生产力比较:

$ du -sh in-file
2.4M    in-file
$ TIMEFORMAT=%R

$ time grep -vP '^MX((?!sum).)*$' in-file > out-file
0.049
$ time sed '/^MX/{/sum/!d}' in-file > out-file
0.087
$ time awk  '! /^MX/ || /sum/ {print}' in-file > out-file
0.090
$ time perl -ne '/^MX((?!sum).)*$/ || print' in-file > out-file
0.099

相关内容