Автоматически извлекать uid и gid в команде

Давайте рассмотрим этот тестовый файл:

$ 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 в новой части команды.

0
23.07.2018, 11:45
3 ответа

Одним из способов отладки инициализации оболочки является запуск интерактивной оболочки входа в систему(-li)и указание ей печатать все команды по мере их выполнения и искать то, что вы хотите в выводе:

PS4=' $BASH_SOURCE:$LINENO: ' bash -lixc true |& grep oracle

PS4используется bash для вывода дополнительной информации из опции -x, а если установлено значение $BASH_SOURCE:$LINENO, будет напечатан путь к исходному файлу и номер выполняемой строки. Запуск с -c true |& grep oracleпозволяет нам быстро фильтровать инициализацию одной оболочки. С начальным пробелом bash выделяет строки, когда имеет место вложенный источник.

3
28.01.2020, 02:42

Попробуйте

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выводит фактически выполненные команды с расширенными переменными. Флаги можно комбинировать за счет того, что они становятся менее читаемыми :)

.
0
28.01.2020, 02:42

Вы также можете проверить строку oraenv.

Программа установки базы данных Oracle обычно создает пару сценариев:/usr/local/bin/oraenvдля установки всех переменных среды, необходимых для ядра базы данных Oracle, и /usr/local/bin/coraenvдля их отмены. Поскольку эти сценарии предназначены для манипулирования переменными среды текущего сеанса, они должны быть «исходными», иначе они не будут иметь ожидаемого эффекта.

Возможно, вы включили oraenvв свои сценарии входа, подобные этому:

ORACLE_SID=<database SID here>
ORAENV_ASK=NO
. oraenv

Последняя строка также может быть source oraenv.

0
28.01.2020, 02:42

Теги

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