2009-07-25 43 views

Trả lời

36

Nếu phiên bản của sed cho phép -i.bak cờ (chỉnh sửa tại chỗ):

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

Nếu không, chỉ cần đặt nó trong một vòng lặp bash:

for file in *.txt 
do 
    sed '/line of text/d' "$file" > "$file".new_file.txt 
done 
+1

+1 cho fu' -i.bak' gsed fu. 'For loop' của bạn có thể cần' mv $ file.new_file.txt $ file' để khớp với nó. – nik

+0

@Robert, Nếu bạn bỏ lỡ sed phù hợp, bạn vẫn có thể làm: dòng văn bản «perl -pi.bak -e '| | g' \ *' – nik

+0

Để lại một dòng trống hơn là xóa dòng, phải ? –

1

Tôi đã viết một kịch bản Perl cho điều này:

#!/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); 
    } 
} 

Lưu ý rằng nó loại bỏ dòng dựa trên một regex. Nếu bạn muốn làm kết hợp chính xác, khu vực nội foreach sẽ trông như thế:

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

Cân nhắc -v grep:

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

Grep -v hiển thị tất cả các dòng trừ những dòng khớp nhau, chúng đi vào một tệp tạm thời, và sau đó tmpfile được chuyển trở lại tên tệp cũ.

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

Điều này yêu cầu perl lặp lại tệp của bạn (-n), chỉnh sửa tại chỗ (-i) và in dòng nếu nó không phù hợp với cụm từ thông dụng của bạn.

Hơi liên quan, đây là một cách tiện dụng để thực hiện thay thế trên nhiều tệp.

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

Từ [link] này (http://www.kuro5hin.org/story/2009/3/9/191744/8407): cả perl và sed đều là động cơ NFA truyền thống, vì vậy về mặt lý thuyết chúng không khác biệt nhiều trong hiệu suất, nhưng trong thực tế perl có một số lượng lớn các tối ưu hóa được áp dụng để làm cho nó hoạt động tốt trong các trường hợp phổ biến. – stephenmm

6

Để tìm a pattern và loại bỏ the line containing the pattern dưới lệnh có thể được sử dụng

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

Ví dụ: nếu bạn muốn loại bỏ các dòng có chứa từ sleep trong tất cả các xml file

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

LƯU Ý: Hãy cẩn thận trước khi chọn một mẫu vì nó sẽ xóa dòng đệ quy trong tất cả các tệp trong hệ thống phân cấp thư mục hiện tại :)

Các vấn đề liên quan