SED Замените строку соответствующей линии, которая не запускается с #

Один из способов сделать это - использовать функцию PROMPT_COMMAND в bash для выполнения кода, изменяющего PS1. Функция ниже представляет собой обновленную версию моей первоначальной заявки; в этом случае используется на две переменные среды меньше, и к ним добавляется префикс «_PS1_», чтобы избежать затирания существующих переменных.

prompt_command() {
  _PS1_now=$(date +%s)
  PS1=$( printf "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
           $((  ( _PS1_now - _PS1_lastcmd ) / 3600))         \
           $(( (( _PS1_now - _PS1_lastcmd ) % 3600) / 60 )) \
           $((  ( _PS1_now - _PS1_lastcmd ) % 60))           \
       )
  _PS1_lastcmd=$_PS1_now
}
PROMPT_COMMAND='prompt_command'
_PS1_lastcmd=$(date +%s)

Поместите это в свой .bash_profile, чтобы начать работу.

Обратите внимание, что вам нужно вводить довольно быстро, чтобы параметр sleep соответствовал параметру подсказки - время на самом деле является разницей между подсказками, включая время, необходимое вам для ввода команды.

00:00:02 ~> sleep 5   ## here I typed really quickly
00:00:05 ~> sleep 3   ## here I took about 2 seconds to enter the command
00:00:10 ~> sleep 30 ## more slow typing
00:01:35 ~>

Позднее добавление:

На основании удаленного ответа @Cyrus, вот версия, которая не загромождает среду дополнительными переменными:

PROMPT_COMMAND='
    _prompt(){
        PROMPT_COMMAND="${PROMPT_COMMAND%-*}-$SECONDS))\""
        printf -v PS1 "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
                      "$(($1/3600))" "$((($1%3600)/60))" "$(($1%60))"
    }; _prompt "$((SECONDS'"-$SECONDS))\""

Сверхпозднее добавление:

Начиная с версии bash 4.2 ( echo $ BASH_VERSION ), вы можете избежать внешних вызовов date с новой строкой формата printf; замените части $ (date +% s) на $ (printf '% (% s) T' -1) . Начиная с версии 4.3 , вы можете опустить параметр -1 , чтобы полагаться на поведение «отсутствие аргумента означает сейчас ».

1
30.08.2018, 06:21
2 ответа

попробуй

sed 's/^[^#]*contents of line.*/updated contents/' test-file

или с привязкой к началу строки ^, и вы знаете, что эта строка начинается с content...,ты мог бы сделать:

sed 's/^contents of line.*/updated contents/' test-file

Если вы знаете, какую строку вы собираетесь обновить, вы можете изменить ее напрямую, указав номер строки адреса, например.

sed '2s/.*/updated content/' test-file

добавьте -i, когда вы будете довольны результатом.

4
27.01.2020, 23:11

Вы можете выполнить редактирование следующим образом:

sed -e '/^#/!s/.*/UPDATED_CONTENTS/' input-file.txt

или

sed -e '/^#/!c\
UPDATED_CONTENTS' input-file.txt

это следует читать как :для любой строки, которая не начинается с #, измените всю эту строку на то, что указано.

И если вас беспокоит, что октоторпу могут предшествовать пробелы, измените регулярное выражение на /^[[:blank:]]*#/, оставив все остальное как есть.

6
27.01.2020, 23:11

Теги

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