Нашел эту ветку среди других, и я согласен, что она содержит наиболее полные ответы, поэтому я также добавляю свои:
1) sed и ed так полезны ... вручную !!!
Посмотрите на этот код от @Johnny:
sed -i -e 's/abc/XYZ/g' /tmp/file.txt
2) когда мое ограничение заключается в использовании его сценарием оболочки, никакая переменная не может использоваться внутри вместо abc или XYZ! Это , кажется, согласуется с тем, что я понимаю, по крайней мере. Итак, я не могу использовать:
x='abc'
y='XYZ'
sed -i -e 's/$x/$y/g' /tmp/file.txt
#or,
sed -i -e "s/$x/$y/g" /tmp/file.txt
но что мы можем сделать? Как сказал @Johnny, «пока читаешь ...», но, к сожалению, это еще не конец истории. Следующие хорошо работали со мной:
#edit user's virtual domain
result=
#if nullglob is set then, unset it temporarily
is_nullglob=$( shopt -s | egrep -i '*nullglob' )
if [[ is_nullglob ]]; then
shopt -u nullglob
fi
while IFS= read -r line; do
line="${line//'<servername>'/$server}"
line="${line//'<serveralias>'/$alias}"
line="${line//'<user>'/$user}"
line="${line//'<group>'/$group}"
result="$result""$line"'\n'
done < $tmp
echo -e $result > $tmp
#if nullglob was set then, re-enable it
if [[ is_nullglob ]]; then
shopt -s nullglob
fi
#move user's virtual domain to Apache 2 domain directory
......
3) Как видно, установлен ли тогда nullglob, он ведет себя странно, когда есть строка, содержащая *, как в
<VirtualHost *:80>
ServerName www.example.com
, который становится
<VirtualHost ServerName www.example.com
нет конечной угловой скобки, и Apache2 даже не может загрузить!
4) Этот вид синтаксического анализа должен выполняться медленнее, чем поиск и замена одним нажатием, но, как вы уже видели, есть 4 переменные для 4 различных шаблонов поиска, работающих на один цикл анализа!
Наиболее подходящее решение, которое я могу придумать с учетом предположений о проблеме.