是否有一种简单的方法可以在命令行中从文件夹中删除相同的文本行?
答案 0 :(得分:46)
如果您的sed版本允许-i.bak
标记(就地编辑):
sed -i.bak '/line of text/d' *
如果没有,只需将其放入bash循环中:
for file in *.txt
do
sed '/line of text/d' "$file" > "$file".new_file.txt
done
答案 1 :(得分:17)
要查找a pattern
并删除the line containing the pattern
以下命令,可以使用
find . -name "*" -type f | xargs sed -i -e '/<PATTERN>/d'
示例:
如果您要删除所有sleep
个文件中包含单词xml
的行
find . -name "*.xml" -type f | xargs sed -i -e '/sleep/d'
注意:在选择模式之前要小心,因为它将在当前目录层次结构的所有文件中递归删除该行:)
答案 2 :(得分:4)
考虑grep -v:
for thefile in *.txt ; do
grep -v "text to remove" $thefile > $thefile.$$.tmp
mv $thefile.$$.tmp $thefile
done
grep -v显示除匹配之外的所有行,它们进入临时文件,然后将tmpfile移回旧文件名。
答案 3 :(得分:4)
perl -ni -e 'print if not /mystring/' *
这告诉perl遍历你的文件(-n),就地编辑(-i),如果它与正则表达式不匹配则打印该行。
有点相关,这是一种在多个文件上执行替换的便捷方法。
perl -pi -e 's/something/other/' *
答案 4 :(得分:1)
我为此编写了一个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;
}
}