【发布时间】:2017-04-30 06:24:17
【问题描述】:
我需要做的是使用 sed 命令从 perl 替换文件中的一行。问题是我需要放入文件中的行在几个地方都有 \,我还没有想出如何在没有 perl/sed 删除它们的情况下保留 \。
例子是:
system sed "s/^destinaion=.*/destination=Manager {manager hostname\=$NAME,Manager port\=8443} $USER_NAME/" -i /usr/local/example_file.txt;
在我得到的文件中:
destination=Manager {manager hostname=Bill,Manager port=8443} Fred
我需要进入文件:
destination=Manager {manager hostname\=Bill,Manager port\=8443} Fred
这是一个用于配置的属性文件,需要准确。
使用这个网站,我想出了以下适合我的解决方案:
我在 perl 中的命令(只是一个例子):
$VAR1=$NAME
$VAR2=$USER_NAME
$VAR3='destination=Manager {manager hostname\\\\'
$VAR4='Manager port\\\\=8443} '
system sed 's/^destinaion=.*/$VAR3=$VAR1,$VAR4 $VAR2/' -i
/usr/local/example_file.txt;
输出是:
destination=Manager {manager hostname\=Bill,Manager port\=8443} Fred
这很有效,因为我将同一行传递给 4 个不同的属性文件,具体取决于问题的答案和 redhat 版本。我正在安装的软件具有不同的属性文件,具体取决于所使用的 redhat 版本。我必须通过一次安装来创建属性文件,然后我在脚本中更改属性文件并使用 foreach 在所有服务器上进行安装,这样我就可以运行脚本然后观察错误。
我们目前使用两个版本,因此我必须在脚本中添加 if 语句来选择正确的属性文件。
【问题讨论】:
-
这很棘手;您必须计算出有多少进程正在解释字符串并删除反斜杠。要将单个反斜杠放入输出中,
sed需要在s/…/…/操作的替换部分中看到两个连续的反斜杠。因为你用双引号括起来,Perl 也有机会解释反斜杠;这意味着您需要在 Perl 中为输出中的每个反斜杠添加 4 个反斜杠。 -
在 Perl 本身中进行替换通常更快,而无需使用。
-
不仅更快,更重要的是:更不容易出错。事实上,我很困惑为什么你会想从
perl调用sed,除非你有一个复杂且经过充分测试的sed脚本可供使用。