2015-10-18 5 views
-1

я следующая строку в моем профиле:добавить комментарий и новую строку после текста согласования

export JAVA_HOME=/usr/bin/java 

как я могу прокомментировать эту строку и добавить новую строку после этой строки.

ожидаемый результат:

#export JAVA_HOME=/usr/bin/java 
export JAVA_HOME=${java_path} 

Я попробовал этот

Я попытался следующий sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt добавить комментарий, только если он не существует, но это не работает

Спасибо заблаговременно

+1

Пытались ли вы что-нибудь решить эту проблему? –

+0

Я пробовал следующее: sed -e '/ export JAVA_HOME =/usr/bin/java/s/^ # */# /' MO12

+2

Пожалуйста, нажмите «изменить» и поместите это в вопрос вместо комментария. –

ответ

1

Попробуйте следующее (предполагается, 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-й группе, ...
+1

Спасибо, это сработало. Я сделал 'sed -i.bak' для резервного копирования exisitng-файла, а также выполнил команду несколько раз, чтобы убедиться, что он не добавляет одну и ту же строку снова и снова. – MO12

Смежные вопросы