【问题标题】:RegEx for replacing capture group content using sed使用 sed 替换捕获组内容的正则表达式
【发布时间】:2019-10-16 17:36:40
【问题描述】:

在需要匹配和解析每个节并将 index= 修改为 index=secure 的多个目录中有 inputs.conf 文件。 这是inputs.conf中的文件类型,并且运行脚本以在此目录(_GWAS_pr_linux_t1/local/inputs.conf)中找到输入文件以修改索引

[monitor:///var/log/messages]
index=BDBD_np
sourcetype=syslog

[monitor:///var/log/cron]
index=NDNW_np
sourcetype=syslog

[monitor:///var/log/maillog]
index=BSKX_np
sourcetype=syslog

[monitor:///var/log/secure]
index=NDNDK_np
sourcetype=syslog

[monitor:///var/log/spooler]
index=DNWN_np
sourcetype=syslog

[monitor:///var/log/audit/audit.log]
index=XBJB_np
sourcetype=syslog


    sed -i -e 's/.*(?s)((\[monitor\:\/\/\/var\/log\/messages|secure\]).*?)(?:(?:\r*\n){2})' /index=secure *linux*/local/inputs.conf

############################
match each stanza and modify index name to index=windows
inputs file in this dir (_GWAS_pr_window_t1/local/inputs.conf)


    [WinEventLog://Application]
    checkpointInterval = 5
    current_only = 0
    disabled =0 
    start_from = oldest
    index = 

    [WinEventLog://Security]
    checkpointInterval = 5
    current_only = 0
    disabled =0 
    start_from = oldest
    index = 

    [WinEventLog://System]
    checkpointInterval = 5
    current_only = 0
    disabled =0 
    start_from = oldest
    index = 

    [WinEventLog://ForwardedEvents]
    checkpointInterval = 5
    current_only = 0
    disabled =0 
    start_from = oldest
    index = 

    [WinEventLog://Setup]
    checkpointInterval = 5
    current_only = 0
    disabled =0 
    start_from = oldest
    index = 

    sed -i -e 's/.*(?s)((\[WinEventLog:\/\/Application|Security|System|ForwardedEvents|Setup\]).*?)(?:(?:\r\n){2}) /index=window *window*/local/inputs.conf

【问题讨论】:

  • 请编辑您的问题并向我们展示清晰的输入以及您希望看到的输出。
  • 这是我所期望的,但输出错误 [monitor:///var/log/messages] sourcetype=linux index=secure [monitor:///var/log/secure] sourcetype =linux索引=安全

标签: regex bash sed replace


【解决方案1】:

您可以使用带有-0 mode 的perl,而不是使用逐行读取的sed。例如,您可以在第 1 组中捕获此部分:

[monitor:///var/log/messages]
sourcetype=linux
index=

随后匹配power

然后在替换中,您可以引用组 1 并添加安全 $1secure 以便替换匹配的电源。

(\[monitor:///var/log/(?:messages|secure)\](?:(?:\R.*){2})index=)power

Regex demo

perl -0p -i.bak -e 's#(\[monitor:///var/log/(?:messages|secure)\](?:(?:\R.*){2})index=)power#$1secure#g' inputs.conf

结果:

[monitor:///var/log/messages]
sourcetype=linux
index=secure

更新

如果您想匹配 cmets 中列出的任何单词并将其替换为 index 之后的单词,您可以使用 2 个捕获组:

perl -0p -i.bak -e 's#(\[monitor:///var/log/(messages|secure|cron|spooler|audit\.log)\](?:(?:\R.*){2})index=).*#$1$2#g' inputs.conf

图案

(\[monitor:///var/log/(messages|secure|cron|spooler|audit\.log)\](?:(?:\R.*){2})index=).*

Regex demo

结果:

[monitor:///var/log/messages]
  sourcetype=linux
index=messages

[monitor:///var/log/secure]
  sourcetype=linux
index=secure

【讨论】:

  • 这太棒了,但有些节索引名称不会很强大,它有数百个不同的索引名称,所以我如何匹配每个以 [monitor:///var/log 和以消息、安全、cron、spooler 和 audit.log 结尾] 并更改索引名称而不修改任何不引用此节的索引名称 [monitor:///var/log/messages|secure|cron|maillog|spooler| audit.log] sourcetype=linux 或任何 index=whatever
  • @user10965163 你是这个意思吗? regex101.com/r/MqBVFW/2 或者如果索引名称不能包含空格 regex101.com/r/MqBVFW/3 或者如果您想匹配其中一个单词并将其替换为 index 的值:regex101.com/r/MqBVFW/4
  • 这是我想要匹配和修改索引名称的所有节和一些我不知道的索引名称,所以我希望脚本匹配这个节并更改它具有的任何类型的索引名称[monitor:///var/log/cron] sourcetype=linux_secure index= [monitor:///var/log/secure] sourcetype=linux_secure index=power [monitor:///var/log/messages] sourcetype=linux index=power [monitor:///var/log/spooler] sourcetype=syslog index = linux [monitor:///var/log/audit/audit.log] sourcetype=syslog index= [monitor:///var/日志/邮件日志] sourcetype=系统日志索引=
  • @user10965163 像这样尝试regex101.com/r/KTUlut/1 现在您可以匹配所有变体并使用自己的替换。
  • 超级棒,应该是这样 perl -0p -i.bak -e 's#([monitor:///var/log/(?:messages|secure|cron|spooler |audit/audit\.log|maillog)](?:(?:\R.*){2})index=).*$1secure_linux inputs.conf
【解决方案2】:

这可能对你有用(GNU sed):

sed -E '/^\[/{h;b};G;s/^(index=)power\n.*(messages|secure)\]$/\1secure/;P;d' file

这会将每个节的第一行附加到每一行并使用模式匹配,将power 替换为secure

【讨论】:

  • inputs.conf 在这个目录部署应用程序# _GWAS_pr_linux_t1/local/inputs.conf, _GWAS_np_linux_t1/local/inputs.conf 所以如果运行脚本它说没有这样的文件或目录部署应用程序# sed -E '/^[/{h;b};G;s/^(index=)power\n.*(messages|secure)]$/\1secure/;P;d' inputs.conf _GWAS_pr_linux_t1/ local/inputs.conf _GWAS_pr_linux_t1/local/inputs.conf
  • 因此脚本必须匹配每个节并将索引名称更改为 index=secure_np 或 secure_pr
  • 某些索引名称以 np 和 pr 结尾,因此脚本必须匹配每个节并将索引名称更改为 index=secure_np 或 secure_pr
  • @user10965163 请修改问题以在状态之前和之后显示(还包括所有边缘情况),我发现您的 cmets 很难理解。
猜你喜欢
  • 2015-08-06
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2021-11-14
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
相关资源
最近更新 更多