Попробуйте следующее (предполагается, GNU Sed):
sed -r '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\n\1${java_path}/}' file.txt
С BSD (OSX) Sed (должен также работать с GNU SED), все становится немного сложнее (принимает на себя bash
, ksh
или zsh
в качестве оболочки, за счет использования из $'\n'
, в ANSI C-quoted string, чтобы произвести буквальный перевод строки символа):.
sed -E '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt
A (надеюсь) POSIX-совместимого раствор (еще одном немного сложнее; также предполагает bash
, ksh
или zsh
в качестве оболочки):
sed '\|^\(export JAVA_HOME=\)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt
Как вы можете видеть, различные sed
реализации требуют различных решений, так, особенно с sed
и awk
, но с Unix утилит в целом, то целесообразно упомянуть свою платформу или явно запросить кросс-платформенное решение.
Примечание: Как правило, /.../
используется для разделения регулярных выражений в SED команды, но можно выбрать другой разделитель, который является полезным, если вы хотите, чтобы избежать необходимости избежать /
символов. в самом регулярном выражении. Здесь, я выбрал |
- обратите внимание, что открытие |
должен быть \
убежал (который вы не должны сделать при выборе альтернативного разделителя для s///
).
Что касается , почему ваша команда, sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt
, не работал:
Вы пренебрегли, чтобы избежать /
символов. в регулярном выражении как \/
, что необходимо, учитывая, что ваш Sed-адрес использует /
в качестве регулярного выражения разделителей.
s/^#*/#/
выглядит ноль или более существующих#
символов на соответствующую строку и заменяет их только #
- при данных обстоятельствах, не оп.
- Если вы хотите, чтобы функция
s
работать неявно о том, что контекст адрес (регулярное выражение в начале сценария, который выбирает соответствующие строки) совпадает, вы должны использовать пусто регулярное выражение, то есть s//.../
как в вышеприведенном решении.
- Для ссылки на текст в тексте замещения, вы должны использовать
&
; если есть группы захвата, как и в растворе выше, вы можете обратиться к тому, что они захватываются индекс: \1
относится к 1-й группе, ...
Пытались ли вы что-нибудь решить эту проблему? –
Я пробовал следующее: sed -e '/ export JAVA_HOME =/usr/bin/java/s/^ # */# /'
MO12
Пожалуйста, нажмите «изменить» и поместите это в вопрос вместо комментария. –