perl多行搜索和替换

时间:2020-10-16 19:23:58

标签: perl replace

我需要匹配并替换文件中的代码块。这些是文件的内容:

"56799f8d5282" Cleartext-Password := "56799f8d5282"
    Tunnel-Type = VLAN,
    Tunnel-Medium-type = 6,
    Tunnel-Private-Group-ID = VLAN100

"1ee1c3b88cef" Cleartext-Password := "1ee1c3b88cef"
    Tunnel-Type = VLAN,
    Tunnel-Medium-type = 6,
    Tunnel-Private-Group-ID = VLAN200

"test1" Cleartext-Password := "password1"
    Tunnel-Type = VLAN,
    Tunnel-Medium-type = 6,
    Tunnel-Private-Group-ID = VLAN300

需要搜索属于mac =“ 1ee1c3b88cef”的块,并通过在每行的开头添加#来注释掉该块。最终内容应如下所示:

"56799f8d5282" Cleartext-Password := "56799f8d5282"
    Tunnel-Type = VLAN,
    Tunnel-Medium-type = 6,
    Tunnel-Private-Group-ID = VLAN100

#"1ee1c3b88cef" Cleartext-Password := "1ee1c3b88cef"
#    Tunnel-Type = VLAN,
#    Tunnel-Medium-type = 6,
#    Tunnel-Private-Group-ID = VLAN200

"test1" Cleartext-Password := "password1"
    Tunnel-Type = VLAN,
    Tunnel-Medium-type = 6,
    Tunnel-Private-Group-ID = VLAN300

我正在使用perl -0777pe 's/A/B/' /etc/freeradius/users >> /etc/freeradius/users命令就地替换内容。但是上面代码块中的某些特殊字符与我的命令不匹配,因此无法正常工作。

2 个答案:

答案 0 :(得分:1)

在此处使用段落模式非常有用。段落是一段文本,后跟一个或多个空白行或EOF。使用local $/ = "";或命令行上的-00激活此模式。

perl -00pe's/^(?=.)/#/mg if /^"1ee1c3b88cef"/'

以上内容可以理解为:如果段落以"1ee1c3b88cef"开头,请在每条非空白行的前面加上#


请注意,使用-i是就地编辑的正确方法。

perl -00pe's/^(?=.)/#/mg if /^"1ee1c3b88cef"/' -i /etc/freeradius/users

答案 1 :(得分:0)

使用range而不是搞乱多行匹配和替换很容易:

$ perl -pe 's/^(?=.)/#/ if /^"1ee1c3b88cef"/ .. /^\Z/' /etc/freeradius/users
"56799f8d5282" Cleartext-Password := "56799f8d5282"
    Tunnel-Type = VLAN,
    Tunnel-Medium-type = 6,
    Tunnel-Private-Group-ID = VLAN100

#"1ee1c3b88cef" Cleartext-Password := "1ee1c3b88cef"
#    Tunnel-Type = VLAN,
#    Tunnel-Medium-type = 6,
#    Tunnel-Private-Group-ID = VLAN200

"test1" Cleartext-Password := "password1"
    Tunnel-Type = VLAN,
    Tunnel-Medium-type = 6,
    Tunnel-Private-Group-ID = VLAN300

#添加到之间的每条非空白行的开头,包括从该字符串开始的那一行到下一个空白行。

如果要修改文件,请添加-i

相关问题