![字符串操作中丢失换行符](https://linux22.com/image/1279287/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C%E4%B8%AD%E4%B8%A2%E5%A4%B1%E6%8D%A2%E8%A1%8C%E7%AC%A6.png)
你好,
我有一个 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,因此丢失了换行符$phppgadmin
,echo
这意味着 shell 会在空格处拆分变量的内容。如果您使用"$phppgadmin"
反而。
此外:
不要使用
`cat`
,而应使用`<file`
或$(<file)
代替。${phppgadmin//$/'\n'}
将会摧毁任何真实的$
原始配置文件可能具有。
重写剧本,仍然不如sed
上面的命令可靠:
conf=$(< /etc/phppgadmin/apache.conf)
conf=${conf/Alias \/phppgadmin/Alias \/!phppgadmin}
echo "$conf" > /etc/phppgadmin/apache.conf