在Linux中删除多个文件中的文本行

有没有一种简单的方法来从命令行中的文本文件夹中删除相同的文本行?

Solutions Collecting From Web of "在Linux中删除多个文件中的文本行"

sed -i.bak '/line of text/d' * 

如果您的sed版本允许-i.bak标志(就地编辑)。 如果不是简单地把它放在一个bash循环中:

 for file in $(ls *.txt) do sed '/line of text/d' $file > $file.new_file.txt done 

考虑grep -v:

 for thefile in *.txt ; do grep -v "text to remove" $thefile > $thefile.$$.tmp mv $thefile.$$.tmp $thefile done 

grep -v显示除匹配的所有行之外的所有行,它们进入临时文件,然后将tmpfile移回旧文件名。

 perl -ni -e 'print if not /mystring/' * 

这告诉perl遍历你的文件(-n),就地编辑(-i),并打印出与正则表达式不匹配的行。

有一点相关,这里有一个方便的方法来执行替换多个文件。

 perl -pi -e 's/something/other/' * 

可以使用下面的命令找到a pattern并删除the line containing the pattern

 find . -name "*" -type f | xargs sed -i -e '/<PATTERN>/d' 

例如:如果你想在所有的xml文件中删除包含word sleep的行

 find . -name "*.xml" -type f | xargs sed -i -e '/sleep/d' 

注:在选择模式之前要小心,因为它会在当前目录层次结构中的所有文件中递归地删除该行。

我为此写了一个Perl脚本:

 #!/usr/bin/perl use IO::Handle; my $pat = shift(@ARGV) or die("Usage: $0 pattern files\n"); die("Usage $0 pattern files\n") unless @ARGV; foreach my $file (@ARGV) { my $io = new IO::Handle; open($io, $file) or die("Cannot read $file: $!\n"); my @file = <$io>; close($io); foreach my $line (@file) { if($line =~ /$pat/o) { $line = ''; $found = 1; last; } } if($found) { open($io, ">$file") or die("Cannot write $file: $!\n"); print $io @file; close($io); } } 

请注意,它删除基于正则表达式的行。 如果你想做精确的匹配,那么内部的foreach将会是这样的:

 foreach $line (@file) { chomp $line; if($line eq $pat) { $line = ''; $found = 1; last; } }