Проблема в том, что [[$NMAP | grep "Host is up" -ne ""]]
очень далек от корректного синтаксиса bash. Сообщения об ошибках не говорят вам, как именно это исправить, но они намекают на то, что что-то серьезно не так.
[[
выражение]]
требует пробелов внутри скобок. См. Скобки в условии if :, почему я получаю синтаксические ошибки без пробелов?|
— оператор канала между командами. Это не оператор в условных выражениях . На самом деле [[ foo | bar ]]
анализируется как команда [[ foo
, переданная в команду bar ]]
, которая не делает ничего полезного. -eq
сравнивает целые числа, но то, что вы окружаете, не является целым числом. Чтобы проверить, содержит ли строка подстроку, вы можете либо использовать оператор ==
в условном выражении, или конвейер через grep (, который не включают условное выражение ). С grep вы не запускаете $NMAP
как команду, вы хотите передать это как входные данные для grep, поэтому вам нужно echo
его в канал. Передайте -q
в grep, так как вас интересует только его статус возврата, а не вывод.
if echo "$NMAP" | grep "Host is up" && echo "$NMAP" | grep "closed"; then …
С условным выражением:
if [[ $NMAP == *"Host is up"* || $NMAP == *"closed"* ]]; then …
Обязательно прочтите Запутался в операторах [[ vs [ vs (vs ((, которые объясняют условные выражения и то, что они не являются единственным способом проверить истинность условия. Кроме того, прочтите Почему мой сценарий оболочки забивается пробелами или другими специальными символами?
Что-P
(расширение GNU )предназначено для P
регулярных выражений erl, поэтому:
<file perl -0777 -pe 's/<#.*?#>//sg'
Если это не обязательно grep
, вы можете сделать это с помощьюawk
:
awk 'BEGIN {p=1}; $1 == "<#" {p=0}; $1 == "#>" {p=1; next}; p == 1 {print}' file
Это установит внутренний флаг p
в 1 в начале, установит его в 0
после того, как будет найден шаблон «начало исключения», и установит его обратно в 1 при обнаружении «конца исключения». Затем он будет печатать только строки, где p равно 1. Оператор next
в правиле для сопоставления конца необходим для предотвращения печати шаблона конца.
Вы можете сделать это с помощьюsed
sed '/<#/,/#>/d' file
Удаляет текст между двумя определенными строками.
Не знаю, элегантно ли это, я взял это на рассмотрение:
tr "\n" "%" < file | sed -e 's/<#%.*#>%//' | tr "%" "\n"
Заменить новые строки на%
tr "\n" "%"
Заменить все между<#%...#>%
:
sed -e 's/<#%.*#>%//'
Заменить %
новыми строками:
tr "$" "\n"
Выход:
This is some text
He is running like a rabbit