xdgmenumaker на github — лучший выбор, чтобы делать именно то, что вы хотите. Он будет автоматически создавать полное меню на основе файлов.desktop и автоматически обновлять его каждый раз, когда вы его открываете.
Вы можете использовать утилиту awk , которая просматривает строки с точки зрения полей, разделенных разделителями, которые вы установили в командной строке с опцией -F.
read new_email_address
awk -F '"' -v new="$new_email_address" '
$1 == "$to = " {$2 = new}
1' OFS='"' your_phpfile
awk -v q=\" -v new="$new_email_address" '
BEGIN {
new_esc = new
gsub(/[&]/, "\\\\&", new_esc)
repl = q new_esc q";"
}
sub(\
/\$to = ".*";$/, \
"$to = " repl \
)+1' your_phpfile
Переменные оболочки в кавычках будут раскрыты только в том случае, если их внешний уровень кавычек является двойной кавычкой. Для иллюстрации:
$ var=foo
$ echo '"$var"'
"$var"
$ echo "'$var'"
'foo'
Таким образом, переменные раскрываются только в том случае, если внешний уровень кавычек вокруг них двойной.
Следующая проблема заключается в том, что ваше регулярное выражение неверно. $
в регулярном выражении означает «конец строки», поэтому у вас не может быть несколько $
в таком виде. Я действительно не понимаю, что вы пытаетесь сделать с этим регулярным выражением, поэтому я просто предполагаю, что вы хотите изменить адрес электронной почты, найденный после строки $to =
. Если да, попробуйте это:
sed -i "s/\\$to = \"[^\"]*\"/\\$to = $new_email_address/" FILE
Мне нужно экранировать"
(\"
)и $
(\$to
), чтобы $to
не читалась как переменная, и поэтому внутренний "
не закрывает отверстие "
. Я также должен добавить еще один уровень побега (\\$
), чтобы $
не был виден оболочке и вместо этого передавался sed. И да, я понимаю, что это смехотворно сложно.
Кроме того, вы можете разделить его на несколько выражений в одинарных и двойных кавычках, как я думаю, вы пытались сделать:
sed 's/\$to = "[^"]*"/$to = '"$new_email_address"'/' FILE