Проверка наличия 2 точных строк в текстовом файле с помощью grep [закрыто]

-1
15.01.2017, 23:00
2 ответа

Когда вы делаете это:

check=`echo $?`

Вы заставляете оболочку расширяться $? , чтобы составить команду echo $? , а затем назначить ее вывод переменной. Если вы хотите сохранить статус возврата команды, вырежьте среднего человека и просто сделайте следующее:

check=$?

Однако в вашем случае вам не нужно сохранять статус возврата. Оператор if сам по себе может выполнить проверку && .

Итак, если вы хотите найти текстовый файл, содержащий две строки, сделайте следующее:

if grep -qwF "$Author" "BookDB.txt" && grep -qwF "$Title" "BookDB.txt"; then
    echo Yes
fi

Параметр -q предназначен для подавления вывода grep и -F - не анализировать шаблон как регулярное выражение.

Однако, что вы, скорее всего, ищете, это строка, содержащая заголовок, за которым следует имя автора, учитывая ваш пример. Итак, вы можете попробовать следующее:

if grep -q "^\\s*$Title\\s*:\\s*$Author\\s*\$" "BookDB.txt"; then
    echo yes
fi

Это потребует от пользователя ввести полное название и полное имя автора, а также правильно указать регистр.Так что, может быть, вам нужно что-то более снисходительное:

if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
    echo yes
fi

Теперь вас не волнует регистр и вам не нужны полные имена ( John и john оба соответствуют ДЖОН Кавендиш ). То же относится к названию.


Следующий MCVE

echo Title:
read Title
echo Author:
read Author
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
    echo Found
fi

работает для следующего файла "BookDB.txt":

Название книги: AuthorName
Название книги: authorname
Название книги: Authorname
книга: authorName

с тестовым примером книга и автор .

2
28.01.2020, 05:08

Что ж, вы все еще не сказали, какой результат вы хотите получить от какого ввода, так что я пойду чтобы угадать. Думаю, вы хотите сделать что-то одно (например, вывести «Найдено») , если пользователь вводит Title = "Three Little Pigs" и Author = " Мэри Джейн ", или, если пользователь вводит Title =" Cinderella " и Author =" Paul Johnson " (или любой другой строка в файле) и что-то еще (например, вывод «Not Found»), если пользователь вводит что-нибудь еще (например, Title = "Three и Автор = "Мэри" , или Title = "Три поросенка" и Автор = "Пол Джонсон" ). Я предлагаю вам использовать ответ phk и выполнить

if grep "^\s*$Title\s*:\s*$Author\s*$" BookDB.txt > /dev/null
then
    echo "Found"
else
    echo "Not Found"
fi

, либо вы можете изменить первую строку на

if grep -x "\s*$Title\s*:\s*$Author\s*" BookDB.txt > /dev/null

. Примечания:

  • ^ представляет начало строки .
  • $ обозначает конец строки.
  • Следовательно, ^ образец $ представляет собой образец , занимающий всю строку.
  • grep -x " шаблон " также представляют устанавливает шаблон , занимающий всю строку. Если вы внимательно прочитаете Соответствие точной строке с помощью grep , вы увидите, что перепутали -w и -x .
  • \ s означает пробел. \ s * означает ноль или более пробелов.
  • Собираем все вместе: шаблон означает ноль или более пробелов в начале строки, , за которым следует заголовок, за которым следует ноль или более пробелов. , двоеточие, ноль или более пробелов, автор и ноль или более пробелов (и ничего больше в строке).
  • Используйте > / dev / null , чтобы соответствующие строки не отображались на выходе (т. Е. На экране). Как указывает giusti , вы также можете использовать -q (или - quiet или - -silent ) для этого.

Как указано в phk , вы можете получить неожиданные / нежелательные результаты , если название или имя автора включают двоеточие, или если пользователь вводит любой символ (s) , которые являются специальными в регулярных выражениях (например, ^ , $ , \ , * , [, ] , . , или иногда (, ) , {, } , ? и + ).

1
28.01.2020, 05:08

Теги

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