Как пропустить файл в sed, если он содержит regex?

Можно использовать lsof вместо netstat: что-то вроде этого: sudo /usr/sbin/lsof -i tcp@1.2.3.4:80, но lsof только доступен пользователю root и часто не установленный по умолчанию, таким образом, это - дополнительная внешняя зависимость.

4
10.04.2013, 17:48
3 ответа

Если Вы доверяете gitточка зрения на том, что является двоичным файлом или нет, можно использовать git grep получить список недвоичных файлов. Принятие t.cpp текстовый файл, и ls двоичный файл, оба, в которых зарегистрировались:

$ ls
t.cpp ls
$ git grep -I --name-only -e ''
t.cpp

-I средства опции:

-I
Не соответствуйте шаблону в двоичных файлах.

Объединить это с Вашим sed выражение:

$ git grep -I --name-only -z -e '' | \
       xargs -0 sed -i.bk -e 's/[ \t]\+\(\r\?\)$/\1/;$a\'

(-z / xargs -0 помочь со странными именами файлов.)

Проверьте git grep страница справочника для других полезных опций - --no-index или --cached мог помочь в зависимости от точно, на какой набор файлов Вы хотите воздействовать.

2
27.01.2020, 20:54
  • 1
    Аккуратный! Обратите внимание, что это пропускает файлы типа"Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators". –  l0b0 11.04.2012, 17:18
  • 2
    Ну, да, вот почему существует точка зрения "доверительного мерзавца" правовая оговорка :) Обратите внимание, что я не уверен, что Ваше sed выражение работало бы над UTF-16 (не делает на моей машине здесь, но я предполагаю, что могли быть пути/настройки заставить его работать). –  Mat 11.04.2012, 17:22
  • 3
    Ну, да, вот почему существует точка зрения "доверительного мерзавца" правовая оговорка :) Обратите внимание, что я не уверен, что Ваше sed выражение работало бы над UTF-16 (не делает на моей машине здесь, но я предполагаю, что могли быть пути/настройки заставить его работать). –  Mat 11.04.2012, 17:22
  • 4
    Несомненно, это не было предназначено как жалоба просто к вашему сведению. В конце концов, UTF-16 действительно редок в эти дни. –  l0b0 11.04.2012, 17:25

Вот сценарий Perl, который выполняет итерации по его аргументам (который должен быть именами файлов), и добавляет новую строку в каждый файл, который не заканчивается в новой строке. Файлы, содержащие пустой байт, пропускаются. Файлы, которые уже заканчиваются в новой строке, не изменяются. Файлы, которые содержат CR, получают добавленный CRLF, другие получают просто LF. Непротестированный.

#!/usr/bin/env perl
foreach my $f (@ARGV) {
    open F, "<", $f or die;
    my $last = undef;
    my $cr = 0;
    while (<>) {if (/\0/) {undef $last; break} $last = $_; ++$cr if /\r$/}
    close F;
    if (defined $last && $last !~ /\n\Z/) {
        open F, ">>", $f or die;
        print($cr ? "\r\n" : "\n");
        close F or die;
    }
}
1
27.01.2020, 20:54
[12227] Есть ли способ пропустить весь файл, если какая-то строка совпадает с регексом в sed?[12228]Да, есть.[12229]
2
27.01.2020, 20:54

Теги

Похожие вопросы