Почему я не могу добавить новую строку в файл с оболочкой sed - PullRequest
0 голосов
/ 09 июля 2019

В моем проекте у меня есть файл 1.

Содержимое этого файла1 выглядит следующим образом:

HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
  export HISTCONTROL=ignoreboth
else
  export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL

# By default, we want umask to get set.
# Current threshold for system .

Теперь я хочу добавить предложение после:

export PATH USER LOGNAME MAIL

Это предложение

export PROMPT_COMMAND='echo "`date +%Y-%m-%d" "%H:%M:%S`","`who`" >> linshi'

Итак, я написал сценарий cmdRecord.sh:

newLine="export PROMPT_COMMAND='echo \"`date +%Y-%m-%d\" \"%H:%M:%S`\",\"`who`\" >> linshi'"

baseLN="export PATH USER LOGNAME MAIL"

sed -i '/$baseLN/a$newLine' file1

После выполнения: sh cmdRecord.sh, правильное содержимое файла file1 должно быть:

HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
   export HISTCONTROL=ignoreboth
else
   export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL
export PROMPT_COMMAND='echo "`date +%Y-%m-%d" "%H:%M:%S`","`who`" >> linshi'

# By default, we want umask to get set.
# Current threshold for system .

Но, к сожалению, это не удалось, новое предложение не отображается в файле 1.

Я пробовал:

sed -i "/ $ baseLN / a $ addNL"file1

Но команда выполняется в новой строке, результат:

 HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
  export HISTCONTROL=ignoreboth
else
  export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL
export PROMPT_COMMAND='echo 2019-07-09 11:45:08,"root  pts/0 2019-07-09 11:38 (ln01)" >> linshi'"

# By default, we want umask to get set.
# Current threshold for system .

Новая строка изменена !!Кажется, нет ничего плохого, кто может мне помочь?

Ответы [ 4 ]

0 голосов
/ 12 июля 2019

Это может работать для вас (GNU sed и Bash):

cat <<\! | sed -i '/export PATH USER LOGNAME MAIL/r /dev/stdin' file
export PROMPT_COMMAND='echo "`date +%Y-%m-%d" "%H:%M:%S`","`who`" >> linshi'
!
0 голосов
/ 09 июля 2019

Вы должны отменить специальное значение символов "и" для bash со знаком выхода:

sed "/export PATH USER LOGNAME MAIL/a export PROMPT_COMMAND='echo \"\`date +%Y-%m-%d\" \"%H:%M:%S\`\",\"\`who\`\" >> linshi'" file1

С помощью опции -i (sed -i ...) вы можете изменитьвстроенный файл.

0 голосов
/ 09 июля 2019

Ваша первая задача - заполнить newLine так, как вы хотите.Вы можете избежать добавления обратной косой черты с синтаксисом https://serverfault.com/a/72511

IFS= read -r -d '' newLine <<"END"
export PROMPT_COMMAND='echo "`date +%Y-%m-%d" "%H:%M:%S`","`who`" >> linshi'
END

Вы можете сделать команду sed с помощью

baseLN="export PATH USER LOGNAME MAIL"
cmd=$(printf "/%s/a%s" "${baseLN}" "${newLine}")
sed "${cmd}" file1
0 голосов
/ 09 июля 2019
newLine="export PROMPT_COMMAND=\'echo \"\`date +%Y-%m-%d\" \"%H:%M:%S\`\",\"\`who\`\" >> linshi\'"

Хорошо работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...