Как удалить многострочные строки с помощью bash?

Проблема в том, что [[$NMAP | grep "Host is up" -ne ""]]очень далек от корректного синтаксиса bash. Сообщения об ошибках не говорят вам, как именно это исправить, но они намекают на то, что что-то серьезно не так.

Чтобы проверить, содержит ли строка подстроку, вы можете либо использовать оператор ==в условном выражении, или конвейер через 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 ((, которые объясняют условные выражения и то, что они не являются единственным способом проверить истинность условия. Кроме того, прочтите Почему мой сценарий оболочки забивается пробелами или другими специальными символами?

0
12.11.2019, 16:35
4 ответа

Что-P(расширение GNU )предназначено для Pрегулярных выражений erl, поэтому:

<file perl -0777 -pe 's/<#.*?#>//sg'
2
28.01.2020, 02:14

Если это не обязательно grep, вы можете сделать это с помощьюawk:

awk 'BEGIN {p=1}; $1 == "<#" {p=0}; $1 == "#>" {p=1; next}; p == 1 {print}' file

Это установит внутренний флаг pв 1 в начале, установит его в 0после того, как будет найден шаблон «начало исключения», и установит его обратно в 1 при обнаружении «конца исключения». Затем он будет печатать только строки, где p равно 1. Оператор nextв правиле для сопоставления конца необходим для предотвращения печати шаблона конца.

1
28.01.2020, 02:14

Вы можете сделать это с помощьюsed

sed '/<#/,/#>/d' file

Удаляет текст между двумя определенными строками.

4
28.01.2020, 02:14

Не знаю, элегантно ли это, я взял это на рассмотрение:

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
0
28.01.2020, 02:14

Теги

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