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

Как удалить строки файла (хосты), содержащие строку «adf.ly»?

1
задан 17 June 2015 в 08:50

5 ответов

Используя awk (благодаря тердону для сокращенной версии):

< inputfile awk '!/adf\.ly/' > outputfile
< inputfile: перенаправляет содержимое inputfile на awk stdin > outputfile : перенаправляет содержимое awk 'stdout на outputfile

awk: < inputfile: перенаправляет содержимое inputfile ] awk stdin

Использование Perl (благодаря тердону для сокращенной версии):

< inputfile perl -ne '/adf\.ly/||print' > outputfile
-n: помещает цикл while (<>) {[...]} вокруг скрипта > outputfile: перенаправляет содержимое awk 's stdout на outputfile

Повреждение команды Perl :

-n: помещает цикл while (<>) {[...]} вокруг скрипта adf\.ly: соответствует строке adf\.ly / останавливает шаблон ||: выполняет следующая команда, только если шаблон не соответствует строке print: печатает строку
3
ответ дан 23 May 2018 в 19:47
  • 1
    Почему не только awk '!/ad\.fly/' in > out? Вы также можете сократить Perl до perl -ne '/ad\.fly/||print' file, если вы играете в гольф :) – terdon♦ 16 June 2015 в 15:03
  • 2
    @terdon Потому что я глуп (awk) и во всяком случае не тот, кто владеет обоими языками. Спасибо за ваши предложения (кстати, я не получил ссылку для гольфа!) – kos 16 June 2015 в 15:19
  • 3
    Игра в гольф - это игра, позволяющая сделать код максимально кратким, как правило, ценой жертвоприношения. Я хочу сказать, что альтернатива, которую я дал, была короче, но ваша была намного понятнее и понятнее для неспециалиста. – terdon♦ 16 June 2015 в 16:11
  • 4
    @terdon А я вижу, да, я бы сказал, что я тогда. В конце концов, это объясняется сразу после – kos 16 June 2015 в 16:29

Ниже будут удалены строки, содержащие «adf.ly» в filename.txt:

sed -i '/adf\.ly/d' filename.txt

Используйте приведенную выше команду без -i, чтобы проверить ее перед удалением строк.

3
ответ дан 23 May 2018 в 19:47

Здесь bash однострочный:

while IFS= read -r i; do [[ ! $i =~ .*adf\.ly.* ]] && echo "$i"; done <file.txt
Переменная i будет содержать каждую строку, а итерация [[$i =~ .*adf\.ly.* ]] проверяет, имеет ли строка строку adf.ly, [ f7] отменяет проверку, поэтому [[ ! $i =~ .*adf\.ly.* ]] проверяет, не содержит ли строка adf.ly Если yes (&&), тогда строка будет напечатана.

Чтобы сохранить вывод в другом файле (out.txt):

while IFS= read -r i; do [[ ! $i =~ .*adf\.ly.* ]] && echo "$i"; done <file.txt >out.txt
1
ответ дан 23 May 2018 в 19:47
  • 1
    +1, просто небольшое предложение, вы можете напрямую сопоставить шаблон с adf\.ly – kos 16 June 2015 в 15:47

Вы можете использовать стандартный текстовый редактор, ed:

printf '%s\n' 'g/adf\.ly/d' w q | ed file.txt
1
ответ дан 23 May 2018 в 19:47

Вы можете использовать Vim в режиме Ex:

ex -sc 'g/adf\.ly/d' -cx hosts
g глобальный поиск d удалить x сохранить и закрыть
1
ответ дан 23 May 2018 в 19:47

Другие вопросы по тегам:

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