字符串操作中丢失换行符

字符串操作中丢失换行符

你好,

我有一个 bash 脚本,它安装 phppgadmin 并用 !phppgadmin 替换别名 phppgadmin。

这是我的脚本:

#installing phppgadmin and tell my Apache conf file to include it
apt-get install --force-yes phppgadmin && echo 'Include /etc/phppgadmin/apache.conf' >> /my/conf/apache2/apache2.conf

# the string manipulation
phppgadmin=`cat /etc/phppgadmin/apache.conf`
phppgadmin=${phppgadmin/Alias \/phppgadmin/Alias \/!phppgadmin}

#saving result
echo -e $phppgadmin > /etc/phppgadmin/apache.conf

这种方法效果很好,只是换行符会丢失,因此 Apache 会抱怨文件不可读。我尝试使用 cat -E,但没有成功。

任何想法?

编辑:好的,看来我不明白cat -E在做什么。它实际上用美元符号代替了换行符,所以这就是我现在得到的结果:

phppgadmin=`cat -E /etc/phppgadmin/apache.conf`
phppgadmin=${phppgadmin/Alias \/phppgadmin/Alias \/!phppgadmin}
phppgadmin=${phppgadmin//$/'\n'}

echo -e $phppgadmin > /etc/phppgadmin/apache.conf

所以,问题解决了!

答案1

要修改配置文件,sed比 bash 更可靠:

sed -i 's|^Alias /phppgadmin|Alias /!phppgadmin|' /etc/phppgadmin/apache.conf

由于您传递了 unquoted,因此丢失了换行符$phppgadminecho这意味着 shell 会在空格处拆分变量的内容。如果您使用"$phppgadmin"反而。

此外:

  1. 不要使用`cat`,而应使用`<file`$(<file)代替。

  2. ${phppgadmin//$/'\n'}将会摧毁任何真实的 $原始配置文件可能具有。

重写剧本,仍然不如sed上面的命令可靠:

conf=$(< /etc/phppgadmin/apache.conf)
conf=${conf/Alias \/phppgadmin/Alias \/!phppgadmin}
echo "$conf" > /etc/phppgadmin/apache.conf

相关内容