带有几行包含“#”和特定文本的正则表达式

Posted

技术标签:

【中文标题】带有几行包含“#”和特定文本的正则表达式【英文标题】:Regex with a few lines containing "#" and a specific text 【发布时间】:2021-08-10 07:28:49 【问题描述】:

我们正在尝试更新多服务器配置文件,在特定行之前使用特定位置的新条目。示例包含部分配置文件

#
#
#
#
# The lines below should not be replaced in this file
# Contact Sysadmins before make changes to this line

我需要将包括“#”和换行符在内的这些行与上述行匹配,然后在这些行上方添加新条目,例如

New entry 1
New entry 2
#
#
#
#
# The lines below should not be replaced in this file
# Contact Sysadmins before make changes to this line

在perl中尝试了这个作为内联代码,如下

/usr/bin/perl -lne 'print "\nNew entry 1\nNew entry 2" if (/[#\n]*# The lines below should not be replaced in this file/); print $_' filename

我的正则表达式不起作用。我不是任何其他语言的 perl 或正则表达式专家。在许多服务器上,而不是 4 个“#”可​​能有 2 个或 3 个,在该行之前。任何帮助将不胜感激。我必须在 2000 多台服务器上更新同一个文件。

【问题讨论】:

欢迎来到 SO。在您的 if 子句中是一个正则表达式。如果匹配,该块将被执行。您的数据没有变化。然后一个if 需要在珍珠中总​​是一个块 @Andy A. 不,EXPR if COND_EXPR; 是完全有效的 Perl 语句。和if (COND_EXPR) EXPR; 基本一样。 @ikegami。哦,你是对的,当然!! 【参考方案1】:

您一次处理一行文件,因此[#\n]*# 将永远匹配除# 之外的任何内容。

一种解决方案是告诉 Perl 将整个文件视为一行,从而将整个文件读入内存。

perl -0777pe's/^([#\n]*# The lines below)/New entry 1\nNew entry 2\n$1/mg'

另一个将涉及推迟以# 开头的行的打印。

perl -ne'
   $buf .= $_;
   next if /^#$/;
   print "New entry 1\nNew entry 2\n" if /^# The lines below/;
   print $buf;
   $buf = "";
   END  print $buf; 
'

测试:

$ perl -0777pe's/^([#\n]*# The lines below)/New entry 1\nNew entry 2\n$1/mg' file
New entry 1
New entry 2
#
#
#
#
# The lines below should not be replaced in this file
# Contact Sysadmins before make changes to this line

$ perl -ne'
   $buf .= $_;
   next if /^#$/;
   print "New entry 1\nNew entry 2\n" if /^# The lines below/;
   print $buf;
   $buf = "";
   END  print $buf; 
' file
New entry 1
New entry 2
#
#
#
#
# The lines below should not be replaced in this file
# Contact Sysadmins before make changes to this line

(也执行其他测试。)

【讨论】:

感谢您的建议,但建议的 perl 内联都不能完全按照我的需要工作。第一个给出的输出与我需要的非常相似,例如 # # # New entry 1 New entry 2 # 下面的行不应在此文件中替换 我修复了第一个错误,但第二个完全按照问题提出的问题。 (现在,第一个也是)。如果这不是您需要,请解决您的问题并告诉我。【参考方案2】:

您可以使用 sed 命令替换 #lines 开始位置之前的新条目行。

sed '/#/s/^/New Entry 1\n/' input.txt

【讨论】:

以上是关于带有几行包含“#”和特定文本的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

文本处理三剑客,正则表达式等

XCode Magical Record, MR_findByAttribute - 查找带有特定单词的字符串(正则表达式?)

正则表达式在 bs4 中不起作用

替换 PL/SQL 中的几行正则表达式函数

如何使用正则表达式进行电子邮件控制和自定义域控制?

文本处理及正则表达式