繁体   English   中英

使用sed替换文本文件中的一行,但保留\\作为perl脚本替换行的一部分

[英]Replace a line in a text file using sed but keeping \ as part of the replacement line from perl script

我需要做的是使用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

这是可行的,因为我根据问题的答案和redhat版本将同一行传递给4个不同的属性文件。 我正在安装的软件具有不同的属性文件,具体取决于所使用的Redhat版本。 我必须通过一次安装来创建属性文件,然后在脚本中更改属性文件,并使用foreach在所有服务器上进行安装,这样我可以运行脚本,然后观察错误。

我们当前使用的是两个版本,因此我不得不在脚本中添加if语句以选择正确的属性文件。

如评论中所述:

这很棘手; 您必须确定有多少个进程正在解释字符串并删除反斜杠。 要将单个反斜杠放入输出中,sed需要在s/…/…/操作的替换部分看到两个连续的反斜杠。 由于您将其用双引号引起来,因此Perl也有机会解释反斜杠。 这意味着在输出的每个Perl中,Perl需要4个反斜杠。

因为您正在对system调用使用“数组”表示法(除非语法错误,否则您需要在项目之间使用逗号,并在普通单词周围加上引号),因此避免了shell也解释字符串的情况。

这对我在macOS Sierra 10.12.2上有效,并且也应与GNU 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

##destinaion=Manager {manager hostname=Bill,Manager port=8443} Fred
destination=Manager {manager hostname\=Alexander,Manager port\=8443} The Great

这是一个变体脚本,显示了如何需要不同数量的反斜杠。 连续8个反斜杠的示例将Perl将数字减半为4,将shell将数字减半为2,并且sed在输出中将2解释为1。 当您连续看到8个反斜杠时,您可以确信自己没有以最好的方式处理某些问题。 (在过去的日子里,有时troff文件将连续16个反斜杠,但并不经常出现,很少有人知道为什么需要它们。)

#!/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

这是在变量数据文件上运行变量脚本的结果:

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$USER_NAME扩展,则可以在数组表示法中的s/…/…/命令周围使用单引号引起另一个变体; 它只需要两个反斜杠,而不是四个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM