Команда Grep для строки не завершается только в раскомментированной строке

64-битное ядро ​​можно установить на 32-битный Debian. Вы можете увидеть, что ядро ​​amd64 доступно для 32-битного Debian на странице пакета . Это можно использовать в качестве альтернативы использованию ядра с поддержкой PAE для поддержки более 4G общей оперативной памяти. Обратите внимание, что 32-битные двоичные файлы по-прежнему не могут получить доступ к более чем примерно 3 Г ОЗУ на процесс.

-1
29.11.2018, 11:11
2 ответа

Проблема в том, что вместо поиска nameв не -закомментированных данных в file.txвы запускаете grepдля исходного файла

grep -v '^#' file.tx | grep -P 'name' file.tx
                                      ^^^^^^^
                                     will not read from pipe

Вместо этого используйте

grep -v '^#' file.tx | grep -q 'name'

т. е. не заставляйте второй grepв конвейере читать из исходного файла. Кроме того, поскольку вас интересует только статус выходаgrep(для использования в операторе if), используйте его с -q.


Принимая во внимание ваш второй вопрос, кажется, если я правильно понимаю, что вы хотите запустить cat file.tx, только если строка nameприсутствует вне комментариев. В этом случае у вас обратная логика.

if grep -v '^#' file.ex | grep -q 'name'; then

Это будет верно, если строка nameвстречается в строке без комментария -. Если вы хотите catфайл, вам нужно сделать это здесь:

if grep -v '^#' file.ex | grep -q 'name'; then \
    cat file.tx; \
else \
    echo 'No name'; \
fi

Я не уверен в exit 0, так как это влияет на остальную часть цели Makefile. Если вы хотите, чтобы цель терпела неудачу , если nameотсутствует,затем выполните exit 1после echo, в противном случае вообще не выходите (, если у вас нет дополнительного кода оболочки, который вы не хотите выполнять в той же цели Makefile ).

Я тоже заметил твой cd../... Если у вас нет file.txв текущем каталоге и в каталоге ../.., catвам не удастся. Вы не упомянули, почему вы поднимаетесь на два уровня каталога, поэтому я не могу больше говорить об этом.

Также обратите внимание, что cdбудет «отменено», как только фрагмент оболочки будет завершен, поскольку makeзапускает каждую отдельную строку цели в отдельном экземпляре оболочки. Это также означает, что различные setинструкции, которые у вас есть, выполняются в отдельных оболочках.

0
28.01.2020, 05:09

Насколько я понял вопрос, у вас есть такой файл:

# a comment with the magic word name

some stuff that does not include the magic word

и вы хотите, чтобы было напечатано «Без имени». Если первая строка была раскомментирована, то «Без имени» не должно быть напечатано.

Следующее должно сделать это:

if grep -v '^#' file.tx | grep -q name; then
       echo "no name"
fi

В вашем коде второй grepвключает имя файла, поэтому он не просматривает входные данные из первого. Кроме того, поскольку вы не используете регулярное выражение Perl, я удалил -Pи добавил -q, чтобы подавить любой вывод, который grepмог бы вывести, если что-то совпало.

1
28.01.2020, 05:09

Теги

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