Может grep возвращать true или есть ли альтернативные методы

Таким образом, я предполагаю, что Вы хотите заменить 'кэш' содержанием упомянутой переменной, не с ее именем:

sed 's#^$cache_directory = ../cache.;#$cache_directory = '$new_cache_directory'#' script.php

Таким образом, у Вас есть различные проблемы для решения: Обычно sed управляет, чтобы наклонные черты использования разделили части: 's/foo/bar / '. При контакте с путями это является тревожащим, но мы можем использовать много разделителей - они просто неявно объявляются в следующем'.

Проблема 2 подобна. Мы часто указываем команду в одинарных кавычках:

sed 'command' file 

Но здесь у нас есть апострофы приблизительно./кэшир - что сделать? Одна идея была бы, для использования

sed "command" file 

вместо этого, который часто работает, но не здесь. Апострофы препятствуют Знаку доллара быть интерпретированными, но кавычки не предотвратили бы это. Часто, Вы даже не нуждаетесь в апострофах и можете записать:

sed s/standart/standard/g sample.txt 

но снова, у Вас есть $cache_directory как переменная в команде, которая была бы интерпретирована. Таким образом, я просто заменяю апострофы знаком шутника, точкой, и был бы действительно удивлен, если некоторое другое выражение будет соответствовать той части: ../cache. как xy/cachei - не очень вероятный, не так ли?

Но Вам нравится, когда $new_cache_directory заменяется содержанием переменной, таким образом, я выключаю маскирование с = ', вставьте переменную и включите маскирование снова для окончания команды с '# '.

137
13.01.2019, 23:53
5 ответов

grep возвращает другой код выхода, если он нашел что-то (нуль) по сравнению с тем, если он ничто не нашел (ненулевым). В if оператор, нулевой код выхода отображается на "истинном", и ненулевой код выхода отображается на лжи. Кроме того, grep имеет a -q аргумент для не вывода подобранного текста (но только возвращают код статуса выхода),

Так, можно использовать grep как это:

if grep -q PATTERN file.txt; then
    echo found
else
    echo not found
fi

Как быстрое примечание, когда Вы делаете что-то как if [ -z "$var" ]…, это оказывается этим [ на самом деле команда, которую Вы выполняете, точно так же, как grep. В моей системе это /usr/bin/[. (Ну, технически, Ваша оболочка, вероятно, имеет его встроенный, но это - оптимизация. Это ведет себя, как будто это была команда). Это работает тот же путь, [ возвращает нулевой код выхода для истинного, ненулевой код выхода для лжи. (test то же самое как [, за исключением закрытия ])

199
27.01.2020, 19:29
  • 1
    Почему не делает, если оператору нужны скобки? Я имею его работающий без, но не понимаю почему. Я могу все еще вложить его без скобок? –  Lauren 18.09.2012, 21:47
  • 2
    @Lauren Вы пропускали быстрое примечание? [не часть, если синтаксис, это - (концептуально) команда, Вы работаете, точно так же, как grep –  derobert 18.09.2012, 22:06
  • 3
    @Lauren Вы не используете grep в [Вы используете один или другой, в зависимости от того, какое условие Вы хотите проверить. (Можно использовать любую команду в, если, btw, если просто проверяет код выхода.) … хорошо, я предполагаю, что Вы, вероятно, могли придумать причину использовать grep внутри [но это будет довольно сложным сценарием и не нормальная вещь сделать. –  derobert 18.09.2012, 22:21
  • 4
    К вашему сведению, выполненный ls -l /usr/bin/\[ и man [ видеть это [ программа как любой другой, она просто похожа на синтаксический элемент - это должно сделать ее очевидной и легче понять. (для удобства, [ также встроенное в ударе, тире и других - но это - все еще команда). также попробуйте type -all [ в ударе. –  cas 19.09.2012, 01:56

Другой простой путь состоит в том, чтобы использовать grep -c.

Это производит (не, возвращаются как код выхода), количество строк, которые соответствуют шаблону, таким образом, 0, если там не идет ни в какое сравнение или 1 или больше если существует соответствие.

Так, если бы Вы хотели проверить, что шаблон подобран 3 или больше раза, то Вы сделали бы:

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...
53
27.01.2020, 19:29
  • 1
    Более точно это произведет 1, если найдено только однажды. Производить 1 независимо объем найденного использования соответствий grep -cim1 вместо этого. –  manatwork 29.04.2013, 13:26

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

if [ `grep -q PATTERN file.txt` ]; then
    echo found
else
    echo not found

Эта логика работает для всех команд, просто поместите свои команды внутри обратного апострофа (кнопка над вкладкой или внизу кнопки Esc или слева из 1 кнопки)

-2
27.01.2020, 19:29

Sé que llego tarde a esto, pero me encanta esta versión corta:

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
12
27.01.2020, 19:29

Если мы хотим поймать первое слово файла, нам нужно добавить -zwк grep

if grep -qzw "^$1" file
then 
  ... 
else 
  ... 
fi

Без -zмы получаем первое слово строки. Без -wмы получаем неполные слова.

1
27.01.2020, 19:29

Теги

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