仅当 !exist 存在时,才使用 sed 和 sed 单独对以特定字符串开头的行进行替换

仅当 !exist 存在时,才使用 sed 和 sed 单独对以特定字符串开头的行进行替换

这就是我希望使用 sed 可以实现的功能,但到目前为止还没有骰子:

sed '/^command=/ /\/opt\/home\/user/!s@/home/user/@/opt/home/user/@' authorized_keys

请注意,@ 只是一个有趣的分隔符,我选择用于替换以更轻松地查看斜杠。

基本上我希望正则表达式做的是:“在文件中以字符串:command=开头的任何行上,如果字符串:/opt/home/user不存在,则将/opt/user替换为/opt/home /用户”

我知道理论上我可以使用 if 语句、greps 和 sed 来做到这一点,但这对我来说似乎不太优雅。我非常确定 sed 可以在单行正则表达式中自行完成此操作,但我尝试过的任何组合似乎都会给我带来各种语法错误。奇怪的是,那些单独使用的正则表达式语句在与替换组合时不会给出任何语法错误,只有当我尝试组合它们时才会出现问题。

有人有更优雅的方法来使用 sed 来做到这一点吗?或者我假设 grep 和 sed 之前的 if 语句是执行此操作的最佳方法,这是正确的吗?

答案1

唐克里斯斯蒂建议优雅的解决方案在评论中,但出于教育目的,这里还有其他变体

sed '/^command=/! b; \@/opt/home/user@! s@/home/user@/opt&@' authorized_keys

相关内容