Таким образом, я предполагаю, что Вы хотите заменить 'кэш' содержанием упомянутой переменной, не с ее именем:
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 заменяется содержанием переменной, таким образом, я выключаю маскирование с = '
, вставьте переменную и включите маскирование снова для окончания команды с '# '.
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
то же самое как [
, за исключением закрытия ]
)
Другой простой путь состоит в том, чтобы использовать grep -c
.
Это производит (не, возвращаются как код выхода), количество строк, которые соответствуют шаблону, таким образом, 0, если там не идет ни в какое сравнение или 1 или больше если существует соответствие.
Так, если бы Вы хотели проверить, что шаблон подобран 3 или больше раза, то Вы сделали бы:
if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
...
grep -cim1
вместо этого.
– manatwork
29.04.2013, 13:26
Если вы хотите использовать его с квадратными скобками, вы можете выполнить следующее
if [ `grep -q PATTERN file.txt` ]; then
echo found
else
echo not found
Эта логика работает для всех команд, просто поместите свои команды внутри обратного апострофа (кнопка над вкладкой или внизу кнопки Esc или слева из 1 кнопки)
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
Если мы хотим поймать первое слово файла, нам нужно добавить -zw
к grep
if grep -qzw "^$1" file
then
...
else
...
fi
Без -z
мы получаем первое слово строки. Без -w
мы получаем неполные слова.
ls -l /usr/bin/\[
иman [
видеть это[
программа как любой другой, она просто похожа на синтаксический элемент - это должно сделать ее очевидной и легче понять. (для удобства,[
также встроенное в ударе, тире и других - но это - все еще команда). также попробуйтеtype -all [
в ударе. – cas 19.09.2012, 01:56