Команда sed с использованием регулярных выражений для замены основного второстепенного номера и номера выпуска

Ваш вопрос имеет несколько вводящий в заблуждение заголовок, ведущий ваше исследование в неверном направлении. Когда вы закрываете окно в X , , сервер не убивает ваш процесс . Вместо этого он отправляет сообщение WM_DELETE_WINDOW процессу, который, в свою очередь, завершается. Этот факт обрекает ваш первый подход: даже если вы установите флаг SIGNAL_UNKILLABLE , вы все равно сможете его закрыть.

Ваш второй подход кажется применимым, все, что вам нужно сделать, это отличить одно окно терминала от всех остальных. Один из способов добиться этого - запустить urxvt с определенным заголовком, например urxvt -name urxvt-iddqd , и создать правило для его имени:

<keybind key="A-F4">
 <action name="If">
  <application title="urxvt-iddqd"
    title="tmux-session">
  </application>
  <then><!-- Do nothing for urxvt-tmux-session --></then>
  <else>
   <action name="Close" />
  </else>
 </action>
</keybind>
1
09.05.2019, 01:10
3 ответа

Как вы ожидаете, что ваша команда узнает, какую часть строки версии нужно заменить? .*будет соответствовать всей остальной части строки, поэтому все будет заменено.

Теперь вы можете либо определить шаблон, который соответствует только трем числам, которые вы хотите заменить (это то, что αғsнιη делает по-разному в своем ответе ), либо сохранить номер сборки со ссылкой, как здесь:s/=.*(\..*)/=11.21.2\1/. \.соответствует буквальной точке, поэтому последняя точка и все после нее не могут быть сопоставлены с первой .*. Таким образом, номер сборки будет соответствовать (\..*); размещение его внутри ()делает его доступным при замене как \1.

Я добавляю этот ответ, потому что он кажется мне проще, чем регулярные выражения в ответе αғsнιη. Возможно, дело вкуса.

0
27.01.2020, 23:41

Здесь мы должны сделать предположение, что строка версии (является строкой, а не числом )состоит из четырех полей, разделенных точкой. Итак, просто перехватите последний в LHS вашего регулярного выражения.

Я также рекомендую сначала сосредоточиться на строке, начинающейся с version=, и касаться только части после символа =. Поместите свое регулярное выражение в одинарные кавычки, чтобы escape-последовательности \не были упреждающе экранированы оболочкой. Кроме того, вам не нужно использовать (и )вокруг вашего совпадения, потому что вы не сохраняете его на потом.

sed -i -r '/version=/s/=.*\.[0-9][0-9]*$/version=11.21.2/g' <filename>

В приведенном выше примере я разрешаю последнему полю состоять из нескольких числовых символов. Возможно, вы захотите поместить туда произвольные символы, и в этом случае:

sed  -r '/version=/s/=.*\.([^.]*)$/=11.21.2.\1/g' <filename>

Чтобы принять произвольное изменение в качестве входных данных, скажем:

newver=11.21.2
sed  -r '/version=/s/=.*\.([^.]*)$/='${newver}'.\1/g' <filename>
0
27.01.2020, 23:41

совместимой командой sedбудет:

$ sed 's/version=[1-9]\+[0-9]*\.[0-9]\+\.[0-9]\+/version=11.21.2/' <<<'version=10.20.0.1'
version=11.21.2.1

или с:

sed 's/version=[1-9]\+[0-9]*\(\.[0-9]\+\)\{2\}/version=11.21.2/' <<<'version=10.20.0.1'

или с:

sed -E 's/version=[1-9]+[0-9]*(\.[0-9]+){2}/version=11.21.2/' <<<'version=10.20.0.1'

или даже как показано ниже, если основной номер версии _также может начинаться с 0, как второстепенные и релизные части:

sed -E 's/version=([0-9]+\.){3}/version=11.21.2./' <<<'version=10.20.0.1'
1
27.01.2020, 23:41

Теги

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