RegEx для замены содержимого группы захвата с помощью sed - PullRequest
1 голос
/ 31 мая 2019

Имеет файлы input.conf в нескольких каталогах, которые должны соответствовать и анализировать каждый раздел и изменять index = to index = secure.Это файлы типа в файле input.conf, и они также запускают скрипт, чтобы найти файл входных данных в этом каталоге (_GWAS_pr_linux_t1 / local / input.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

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вместо использования sed, который читает строку за строкой, вы можете использовать perl с режимом -0 .Например, вы можете захватить эту часть в группе 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

Update

Если вы хотите сопоставить какое-либо из перечисленных слов из комментариев и заменить те, которые идут после индекса, вы можете использовать 2 группы захвата:

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

Pattern

(\[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
0 голосов
/ 31 мая 2019

Это может работать для вас (GNU sed):

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

Это добавляет первую строку каждой строфы к каждой другой строке и, используя сопоставление с образцом, заменяет power на secure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...