bash - 删除与 grep 模式匹配的行
问题描述
我有几个文件,除了一个特定文件之外,我必须删除与 grep 模式和之前的行匹配的行。我可以通过以下方式发现线条:
grep -B1 --exclude="my_specific_file.txt" "my_pattern" *_files.txt /dev/null
我想知道是否可以*_files.txt
用 grep 完全删除模式?如果还有其他选择,我很感兴趣。
解决方案
Perl 的救援:
perl -i~ -ne 'BEGIN { $pattern = qr/my_pattern/ }
if (/$pattern/) { $p = "" }
else { print $p; $p = $_ }
print $p if eof && $p !~ /$pattern/;
' -- *_files.txt
-n
逐行读取输入并按后面指定的代码处理每一行-e
-i~
用脚本的输出替换每个文件,保留旧文件作为~
后缀的备份- 我们使用变量
$p
来保留上一行。如果当前行 ($_
) 匹配父行,我们清除前一行,否则,我们打印它并记住当前行。 - 在每个文件的末尾,我们打印最后一行,除非它应该被跳过。如果没有这个,第一行的模式将删除先前处理的文件的最后一行。
推荐阅读
- r - R中的Knit to pdf错误 - 错误:编译失败
- rets - 使用 DMQL2 查询 RETS 服务器时,是否可以获取所有带有属性的照片位置?
- python - 使用 HTMLTestRunner 模块时发生错误
- reactjs - create-react-app bash: /usr/local/bin/create-react-app: 没有这样的文件或目录
- python - QTableWidget Joint Cells 问题:水平连接一系列单元格后,然后我一般连接单元格,所选单元格发疯
- reactjs - 如何推入与我传递给 api 的主体相对应的数组?
- scala - 我想运行一个 scala 文件并期望输出
- r - 矩阵上的下标数不正确。同时将数据帧中的值分配给矩阵
- swift - 禁用 ObservableObject 中 @Published 变量的发送事件
- java - 每次 Oracle 发布更新时,我是否需要更新 JAVA JDK?