Замените часть кода в .profile файлом с помощью sed или awk.

Я пытаюсь изменить .profile (Ubuntu) следующим образом:

Исходный раздел файла .profile:

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists

Я хочу изменить приведенный выше код, чтобы он выглядел так:

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

BASHRC_CONFIG_DIR=/netshare/users/$USER/

if [ -f "$BASHRC_CONFIG_DIR/.bashrc" ]; then
    . "$BASHRC_CONFIG_DIR/.bashrc"
fi



# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$BASHRC_CONFIG_DIR/.bashrc" ]; then
        . "$BASHRC_CONFIG_DIR/.bashrc"
    else
        if [ -f "$HOME/.bashrc" ]; then
            . "$HOME/.bashrc"
        fi
    fi
fi

# set PATH so it includes user's private bin if it exists

Я пробовал так много итераций sed, чтобы заменить блок в верхнем файле файлом, содержащим нижний раздел, и я бьюсь головой о стену. Есть ли у кого-нибудь какие-либо знания sed (или awk), которые они могут передать мне, чтобы я мог добиться этого и положить на голову пакет со льдом?

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

sed -n \
  -e "1,/umask 022/ p" \
  -e"/set PATH/,$ p" \
  -e "/umask 022/ r profile_insertion" \
  /home/username/.profile.bak

И это:

sed -i 's/(umask 022).*(#set PATH)/\1 profile_insertion \2/g' /home/username/.profile

(profile_insertion содержит текст, который я хочу поместить)


person FrustratedCoder    schedule 19.02.2021    source источник
comment
Пожалуйста, добавьте свой код в свой вопрос, что настоятельно рекомендуется на SO (чтобы спрашивающие приложили свои усилия в своем вопросе), спасибо.   -  person RavinderSingh13    schedule 19.02.2021
comment
sed — лучший инструмент для простой замены s/old/new/ в отдельных строках. Если вам нужно сделать что-то большее (как вы), вам гораздо лучше использовать awk для ясности, надежности, эффективности, переносимости, простоты обслуживания/улучшения и т. д.   -  person Ed Morton    schedule 20.02.2021
comment
Очевидно, что вам потребовалось больше времени, чтобы опубликовать этот вопрос, чем просто отредактировать .profile вручную, поэтому - почему вы пытаетесь написать сценарий для этого? Если ответ состоит в том, чтобы внести изменения в 100 .profiles, то можете ли вы действительно полагаться на то, что все эти .profiles имеют точно такие же строки для сопоставления (например, umask 022 и #set PATH) точно в тех же местах, что и .profile в вашем вопросе? Если .profile всегда являются общими, почему бы просто не отредактировать 1 .profile и не скопировать его в остальные 99?   -  person Ed Morton    schedule 20.02.2021


Ответы (1)


Если вы можете преобразовать его в отсечение верхней части файла и заменить его, вы можете использовать awk (см. Удалить все строки перед совпадением с sed).

Убедитесь, что в profileinsertion есть все, что вам нужно, с самого начала файла, и используйте что-то вроде:

cp profileinsertion profile.out; awk '/set PATH so it/{p++;if(p==1){next}}p' /home/username/.profile >> profile.out

...изменив имена файлов по мере необходимости.

person Rick M    schedule 19.02.2021
comment
БЛЕСТЯЩИЙ! Это сработало! Большое спасибо!! - person FrustratedCoder; 20.02.2021
comment
Пожалуйста, рад помочь! Если вы не возражаете, отметьте его как «принятый», нажав зеленую галочку (и проголосуйте, если хотите). Это помогает сосредоточиться на старых вопросах SO, на которые до сих пор нет ответов. Спасибо и удачи! - person Rick M; 20.02.2021