我需要匹配并替换文件中的代码块。这些是文件的内容:
"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
命令就地替换内容。但是上面代码块中的某些特殊字符与我的命令不匹配,因此无法正常工作。
答案 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
。