Как я удаляю строки файла (хосты), которые содержат строку "adf.ly"?
sed
Выполнение эта команда:
sed -i '/adf\.ly/d' inputfile
man sed
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
спасибо за примечания @kos:
grep -v "ad\.fly" inputFile > outputfile
Следующее удалит строки, содержащие «adf.ly» в filename.txt
на месте:
sed -i '/adf\.ly/d' filename.txt
Используйте вышеупомянутую команду без -i
, чтобы проверить ее перед удалением строк.
Вот bash
однострочный:
while IFS= read -r i; do [[ ! $i =~ .*adf\.ly.* ]] && echo "$i"; done <file.txt
Переменная i
будет содержать каждую строку при повторении
[[$i =~ .*adf\.ly.* ]]
проверяет, содержит ли строка строку adf.ly
, !
отменяет проверку, поэтому [[ ! $i =~ .*adf\.ly.* ]]
проверит, не содержит ли строка adf.ly
Если да (&&
), тогда строка будет напечатана.
Чтобы сохранить вывод в другой файл (out.txt
):
while IFS= read -r i; do [[ ! $i =~ .*adf\.ly.* ]] && echo "$i"; done <file.txt >out.txt
Вы могли использовать стандартный текстовый редактор, ed
:
printf '%s\n' 'g/adf\.ly/d' w q | ed file.txt
Можно использовать Vim в режиме Ex:
ex -sc 'g/adf\.ly/d' -cx hosts
g
глобальный поиск
d
удаляет
x
, сохраняют и закрываются
Используя awk
(благодаря terdon для сокращенной версии):
< inputfile awk '!/adf\.ly/' > outputfile
< inputfile
: перенаправляет содержание inputfile
кому: awk
stdin
> outputfile
: перенаправляет содержание awk
stdout
кому: outputfile
awk
разбивка команды:
!/adf\.ly/
: печатает запись, не соответствуя adf\.ly
regexИспользуя Perl (благодаря terdon для сокращенной версии):
< inputfile perl -ne '/adf\.ly/||print' > outputfile
-n
: места a while (<>) {[...]}
цикл вокруг сценария-e
: читает сценарий из аргументовРазбивка команды Perl:
/
: запускает шаблонadf\.ly
: соответствия adf\.ly
строка/
останавливает шаблон||
: выполняет следующую команду, только если шаблон не соответствовал строкеprint
: печатает строку