我需要做的是使用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语句以选择正确的属性文件。
答案 0 :(得分:0)
如评论中所述:
这很棘手;你必须弄清楚有多少进程正在解释字符串并删除反斜杠。要将单个反斜杠放入输出中,sed需要在
s/…/…/
操作的替换部分中看到两个连续的反斜杠。由于你用双引号括起来,Perl也有机会解释反斜杠;这意味着在输出中每个Perl需要4个反斜杠。
因为您正在使用'{1}}调用的'数组'符号(除了语法错误 - 你需要逗号之间的逗号和简单的单词周围的引号),你避免使用shell解释字符串也是。
这对我在macOS Sierra 10.12.2上有效,并且也应该与GNU system
一起使用(将文件重命名为sed
):
data
之前的文件#!/usr/bin/perl
use strict;
use warnings;
my $NAME = "Alexander";
my $USER_NAME = "The Great";
system "sed", "-e", "s/^destinaion=.*/destination=Manager {manager hostname\\\\=$NAME,Manager port\\\\=8443} $USER_NAME/", "-i.bak", "data";
:
data
文件##destinaion=Manager {manager hostname=Bill,Manager port=8443} Fred
destinaion=Manager {manager hostname=Bill,Manager port=8443} Fred
之后:
data
这是一个变体脚本,显示了如何需要不同数量的反斜杠。连续8个反斜杠的示例使Perl将数字减半为4,shell将数字减半为2,##destinaion=Manager {manager hostname=Bill,Manager port=8443} Fred
destination=Manager {manager hostname\=Alexander,Manager port\=8443} The Great
将2解释为输出中的含义1。当你连续看到8个反斜杠时,你可以非常自信地说你没有以最好的方式处理某些事情。 (在以前的日子里,有时候sed
文件会连续有16个反斜杠,但不常见,很少有人理解为什么必要时。)
troff
这是最初的变体数据文件:
#!/usr/bin/perl
use strict;
use warnings;
my $NAME = "Alexander";
my $USER_NAME = "The Great";
system "sed", "-e", "s/^D1=.*/destination1=Manager {manager hostname\\\\=$NAME,Manager port\\\\=8443} $USER_NAME/", "-i.bak", "data";
system "sed -e \"s/^D2=.*/destination2=Manager {manager hostname\\\\\\\\=$NAME,Manager port\\\\\\\\=8443} $USER_NAME/\" -i.bak data";
system "sed -e 's/^D3=.*/destination3=Manager {manager hostname\\\\=$NAME,Manager port\\\\=8443} $USER_NAME/' -i.bak data";
以下是在变体数据文件上运行变体脚本的结果:
D1=Manager {manager hostname=Bill,Manager port=8443} Fred
D2=Manager {manager hostname=Bill,Manager port=8443} Fred
D3=Manager {manager hostname=Bill,Manager port=8443} Fred
如果您不需要展开{{1}}和destination1=Manager {manager hostname\=Alexander,Manager port\=8443} The Great
destination2=Manager {manager hostname\=Alexander,Manager port\=8443} The Great
destination3=Manager {manager hostname\=Alexander,Manager port\=8443} The Great
,则可能会有另一个变量,在数组表示法中围绕$NAME
命令使用单引号;它只需要两个反斜杠,而不是四个。