Давайте рассмотрим этот тестовый файл:
$ cat file
\LeftLabel{foo}
\LeftLabel{$foo}
LeftLabel{foo}
Теперь давайте сделаем замену:
$ sed -E 's|\\LeftLabel\{([^$}][^}]*)\}|\\LeftLabel{\\textsf{\1}}|g' file
\LeftLabel{\textsf{foo}}
\LeftLabel{$foo}
LeftLabel{foo}
Команда замены в sed
выглядит как s | old | new | g
, где старое
- регулярное выражение, новое
- это то, что нужно заменить на его место, а окончательный g
сообщает sed заменить все такие вхождения в линия, а не только первая.
В нашей команде старая часть
выглядит так:
\\LeftLabel\{([^$}][^}]*)\}
Это соответствует \ LeftLabel {
, за которым следует любой символ, кроме $
или }
, то есть [^ $}]
, за которым следует любое количество любых символов, кроме }
, то есть [^}] *
, за которым следует автор }
. Обратите внимание, что перед некоторыми из этих символов должна быть обратная косая черта, чтобы sed рассматривал их как обычные символы, а не как активные для регулярных выражений. Также обратите внимание, что символы внутри фигурных скобок заключены в круглые скобки. Скобки являются активными для регулярных выражений символами, которые сообщают sed сохранить то, что внутри них, как группу 1. Мы можем ссылаться на эти символы как \ 1
в новой
части команды.
Одним из способов отладки инициализации оболочки является запуск интерактивной оболочки входа в систему(-li
)и указание ей печатать все команды по мере их выполнения и искать то, что вы хотите в выводе:
PS4=' $BASH_SOURCE:$LINENO: ' bash -lixc true |& grep oracle
PS4
используется bash для вывода дополнительной информации из опции -x
, а если установлено значение $BASH_SOURCE:$LINENO
, будет напечатан путь к исходному файлу и номер выполняемой строки. Запуск с -c true |& grep oracle
позволяет нам быстро фильтровать инициализацию одной оболочки. С начальным пробелом bash выделяет строки, когда имеет место вложенный источник.
Попробуйте
grep -lr /u01/app/oracle/product/11.2.0/xe/bin /etc/*
Здесь перечислены файлы в /etc/
, содержащие элемент пути. Если, как вы сказали, его нет в файлах, которые вы указали в вопросе, он должен быть ниже /etc/
. Я предполагаю, что это какой-то файл в /etc/profile.d/
.
Обновление 1
Предполагая, что вы используете bash, вы можете попробовать bash -v
или bash -x
, чтобы посмотреть, какие команды выполняются. bash -v
выводит исходный код, bash -x
выводит фактически выполненные команды с расширенными переменными. Флаги можно комбинировать за счет того, что они становятся менее читаемыми :)
Вы также можете проверить строку oraenv
.
Программа установки базы данных Oracle обычно создает пару сценариев:/usr/local/bin/oraenv
для установки всех переменных среды, необходимых для ядра базы данных Oracle, и /usr/local/bin/coraenv
для их отмены. Поскольку эти сценарии предназначены для манипулирования переменными среды текущего сеанса, они должны быть «исходными», иначе они не будут иметь ожидаемого эффекта.
Возможно, вы включили oraenv
в свои сценарии входа, подобные этому:
ORACLE_SID=<database SID here>
ORAENV_ASK=NO
. oraenv
Последняя строка также может быть source oraenv
.