如何找到与模式匹配的行并将其删除?

如何找到与模式匹配的行并将其删除?

在一个包含很多行的文件中,我想删除以 开头的行HERE IT IS

我怎样才能仅使用命令行工具来完成此操作?

答案1

尝试sed

sed -i '/^HERE IT IS/d' <file>

警告:-i使用以下开关时最好进行备份sed

sed -i.bak '/^HERE IT IS/d' <file>

原始文件将保留原样<file>.bak,而修改后的文件将是<file>

答案2

除了您收到的非常好的答案之外grepsed这里还有一些其他可以做同样事情的工具:

  • 一些 Perl 方法:

    perl -ne '/^HERE IT IS/ || print' file > newfile
    perl -ne 'print if !/^HERE IT IS/' file > newfile
    perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    您可以将-i开关添加到任何示例中以就地编辑文件:

    perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (g)awk

    awk '!/^HERE IT IS/' file > newfile
    

    GNU 的较新版本(4.1.1 及更高版本)awk(Linux 上的默认版本awk)也可以就地编辑该文件:

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • Shell(bashzshksh可能还有其他)。不过这有点傻,它但其他工具更好。

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    

答案3

我会用grep它们来过滤掉。例如:

grep -v "^HERE IT IS" infile > outfile

然后将 outfile 移回到 infile。

答案4

另一个python选项:

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

其中 f 是文件的路径,位于引号之间。

相关内容