Я надеялся, что это сработает с использованием sed, но пока без кубиков:
sed '/^command=/ /\/opt\/home\/user/!s@/home/user/@/opt/home/user/@' authorized_keys
Обратите внимание, что @ - это просто забавный разделитель, который я выбрал для замены, чтобы упростить просмотр косых черт.
В основном я хочу, чтобы это регулярное выражение выполняло следующее: «В любой строке файла, начинающейся со строки: command =, тогда, если строка: / opt / home / user не существует, замените / opt / user на / opt / home / user "
Я знаю, что теоретически могу сделать это с помощью операторов if, greps и затем sed, но мне это кажется не изящным.Я почти уверен, что sed может сделать это сам в одном регулярном выражении, но любая комбинация, которую я пробовал, кажется, дает мне всевозможные синтаксические ошибки. Как ни странно, эти операторы регулярного выражения, используемые по отдельности, не дают никаких синтаксических ошибок в сочетании с заменой, только когда я пытаюсь их объединить, у меня возникают проблемы.
У кого-нибудь есть более элегантный способ сделать это с помощью sed? Или я был прав, предполагая, что операторы greps и if перед sed - лучший способ сделать это.
don_crissti посоветуйте элегантное решение в комментариях, но в образовательных целях здесь другой вариант
sed '/^command=/! b; \@/opt/home/user@! s@/home/user@/opt&@' authorized_keys