Bash用sed -不可识别的字符串替换文本



我正在编写一个bash脚本来使用vagrant提供我的服务器。我的配置脚本是一个外部bash脚本。

目前我正试图在我的ssh_config文件中设置横幅,但它似乎不起作用。

我正在网上寻找如何替换文件中的字符串:ssh_config中的默认值是'#Banner none',需要'Banner/etc/issue.net'。

我的问题是,我总是得到一个权限拒绝在/etc/issue.net,但我认为它看到的字符串作为一个文件访问,而不是字符串替换。

我的命令
text_to_find="#Banner none"
text_to_replace= '"Banner /etc/issue.net"'
sed -i 's/$text_to_find/$text_to_replace/g' /etc/ssh/sshd_config

首先,我尝试不使用单引号,我试图转义字符串,但我尝试的所有事情都没有帮助。

你的第二个作业不是一个作业;在=后面加一个空格,它将尝试运行一个名为"Banner /etc/issue.net"的命令,该命令可能不存在,并将变量设置为该命令环境中的空字符串。

另外,您在sed命令中的引号是错误的,所以一旦您获得正确的分配,您将要求sed查找文字$text_to_find并将其替换为$text_to_replace,而不是您存储在这些变量中的字符串。

最后,如果搜索或替换文本中有/,则不能使用/作为seds命令的分隔符。一旦您修复了赋值和引号,并将您想要的实际文本放入sed中,您将得到这样的结果:

sed -i "s/$text_to_find/$text_to_replace/g"

展开为:

sed -i 's/#Banner none/"#Banner /etc/issue.net"/g'

里面有5个/sed应该如何知道哪些是s的参数,哪些是这些参数的一部分?幸运的是,您不必使用/作为分隔符;你可以选择任何角色。例如:

sed -i "s|$text_to_find|$text_to_replace|g" 

你也可以使用一些奇特的扩展技巧,在所有斜杠前面插入一个反斜杠:

sed -i "s/${text_to_find////\/}/${text_to_replace////\/}/g"

但是谁会想在shell脚本上到处都是牙签呢?

另外,对text_to_replace的赋值包括将在文件中结束的文字引号;确保这是你想要的。

最新更新