2014-09-02 3 views
0

Я хочу, чтобы выполнить команду, если блок текста существует т.е.Баш Проверка текстового блока

if [ multiple line string exists ]; then 
    <execute command> 
fi 

Один из нескольких строк линии в вопросе все следующие:

Which test would you like to run? 3 

     [led.test] 
     : This test will light LEDs 1 and 2 
     : 
     : LED1  LED2 
     : -------------- 
     : ON  OFF 
     : OFF  ON 
     : 
------> : Did the LEDs light up as indicated above? (y/n):n: 
FAILED : User indicates LEDs did not light up properly 

Регулярное выражение может использоваться для некоторого текста, но мне нужно, чтобы этот сбой соответствовал этому тесту. Линия FAILED является общей для всех светодиодных тестов, поэтому я надеялся просто выполнить поиск точного блока текста.

Как найти многострочную строку? Я думал о том, чтобы вставить эту строку в переменную, например.

string1=" Which test would you like to run? 3 

     [led.test] 
     : This test will light LEDs 1 and 2 
     : 
     : LED1  LED2 
     : -------------- 
     : ON  OFF 
     : OFF  ON 
     : 
------> : Did the LEDs light up as indicated above? (y/n):n: 
FAILED : User indicates LEDs did not light up properly" 

, а затем как-то проверить, является ли строка1 в файле. Если он существует, я выполняю команду, например. эхо "Строка существует"

+1

Что ваш вопрос? –

+0

@AmalMurali Я пытаюсь закодировать условный оператор для поиска нескольких строк в файле, но я не могу это сделать. – stevo

+0

Хорошо, но что именно вы пытаетесь сделать? «* код для условного оператора для поиска нескольких строк строки в файле *» недостаточно описателен; по крайней мере, для меня. –

ответ

1

Как насчет чего-то подобного?

string1="Which test would you like to run? 3 

    \[led.test\] 
    : This test will light LEDs 1 and 2 
    : 
    : LED1  LED2 
    : -------------- 
    : ON  OFF 
    : OFF  ON 
    : 
------> : Did the LEDs light up as indicated above? \(y/n\):n: 
FAILED : User indicates LEDs did not light up properly" 

#Search the file for the string1 and assign the matching parts to search 
search=`grep "${string1}" file.txt` 

#If the string existed in the file, then search and string1 should match EXACTLY 
if [ "${search}" = "${string1}" ]; then 
    #DO STUFF 
    echo "string exists" 
fi 

Это будет работать только если string1 является именно то, что будет находиться в файле, и нет никаких дубликатов. Если есть дубликаты, вы можете отправить результат grep через uniq.

EDIT: Как указал Шарль Даффи, вы должны быть осторожны с любым символом, который можно было бы считать выражением регулярного выражения. Вы можете просто избежать их с «\»

+0

Лучше использовать 'grep -q', чем' grep' - более эффективно, так как он останавливается, как только находит совпадение, а не продолжается до конца файла, и проверяет статус выхода, а не вывод. –

+0

Также существует опасность того, что 'grep' обрабатывает вашу строку как регулярное выражение или (как в режиме fgrep) как список шаблонов, а не только один. Например, '[led.test]' соответствует одному одиночному символу 'l',' e', 'd',' .' или 't'. –

+0

Да, ты прав. 'grep' действительно путается с' [] ' – omoman

4

Чтение всего файла в оболочку и делать сопоставление с образцом неэффективно, но корректно работает в тех случаях, когда grep не:

if [[ $(<file.txt) = *"$string1"* ]]; then 
Смежные вопросы