замена многострочной строки на sed - PullRequest
1 голос
/ 17 июня 2019

что у меня в логах.

    ---POLICIES WITH 172.25.22.16 AS SOURCE ADDRESS---
    ---POLICIES WITH 172.25.22.16 AS DESTINATION ADDRESS---
    ---POLICIES WITH 172.25.22.17 AS SOURCE ADDRESS---
    some output
    ---POLICIES WITH 172.25.22.17 AS DESTINATION ADDRESS---
    ---POLICIES WITH 172.25.22.18 AS SOURCE ADDRESS---
    some output
    ---POLICIES WITH 172.25.22.18 AS DESTINATION ADDRESS---
    ---POLICIES WITH 172.25.22.19 AS SOURCE ADDRESS---

что нужно

    ---POLICIES WITH 172.25.22.16 AS SOURCE ADDRESS---
    None
    ---POLICIES WITH 172.25.22.16 AS DESTINATION ADDRESS---
    None
    ---POLICIES WITH 172.25.22.17 AS SOURCE ADDRESS---
    some output
    ---POLICIES WITH 172.25.22.17 AS DESTINATION ADDRESS---
    None
    ---POLICIES WITH 172.25.22.18 AS SOURCE ADDRESS---
    some output
    ---POLICIES WITH 172.25.22.18 AS DESTINATION ADDRESS---
    None
    ---POLICIES WITH 172.25.22.19 AS SOURCE ADDRESS---
    None

Я попробовал sed 's: --- \ n ---: ---- \ nNone \ n --- /: gкоторый не делал этого.Мне нужно сделать некоторые замены на всех строках, оканчивающихся на --- только тогда, когда следующая строка начинается с ---

Ответы [ 4 ]

2 голосов
/ 17 июня 2019

Я бы написал

awk '
  /^---/ && prev ~ /^---/ {print "None"}
  {print; prev = $0}
  END {if (/^---/) print "None"}
' file

Немного СУШКИ

awk '
  function none() {if ($0 ~ /^---/ && prev ~ /^---/) {print "None"}}
  {none(); print; prev = $0}
  END {none()}
' file
2 голосов
/ 17 июня 2019

Вы МОЖЕТЕ сделать это с помощью GNU sed (для -E, -z и распознав \n как символ новой строки) с:

$ sed -Ez 's/(---\n)(---|$)/\1None\n\2/g' file
---POLICIES WITH 172.25.22.16 AS SOURCE ADDRESS---
None
---POLICIES WITH 172.25.22.16 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.17 AS SOURCE ADDRESS---
some output
---POLICIES WITH 172.25.22.17 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.18 AS SOURCE ADDRESS---
some output
---POLICIES WITH 172.25.22.18 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.19 AS SOURCE ADDRESS---
None

или GNU awk для RS с несколькими символами и gensub ():

$ awk -v RS='^$' -v ORS= '{$0=gensub(/(---\n)(---|$)/,"\\1None\n\\2","g")}1' file
---POLICIES WITH 172.25.22.16 AS SOURCE ADDRESS---
None
---POLICIES WITH 172.25.22.16 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.17 AS SOURCE ADDRESS---
some output
---POLICIES WITH 172.25.22.17 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.18 AS SOURCE ADDRESS---
some output
---POLICIES WITH 172.25.22.18 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.19 AS SOURCE ADDRESS---
None

но я бы настоятельно рекомендовал использовать вместо этого следующий POSIX awk для переносимости, а не для чтения всего файла в память сразу и возможности его простого улучшения, если вам необходимо внести какие-либо изменения:

$ cat tst.awk
/^---/ { if (NR>1) prt(); hdr=$0; next }
{ txt = txt ORS $0 }
END { prt() }
function prt() {
    print hdr (txt=="" ? ORS "None" : txt)
    hdr = txt = ""
}

$ awk -f tst.awk file
---POLICIES WITH 172.25.22.16 AS SOURCE ADDRESS---
None
---POLICIES WITH 172.25.22.16 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.17 AS SOURCE ADDRESS---
some output
---POLICIES WITH 172.25.22.17 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.18 AS SOURCE ADDRESS---
some output
---POLICIES WITH 172.25.22.18 AS DESTINATION ADDRESS---
None
---POLICIES WITH 172.25.22.19 AS SOURCE ADDRESS---
None
1 голос
/ 18 июня 2019

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

sed -e ':a;/^---.*---$/{${aNone' -e 'b};n;//!b;iNone' -e 'ba}' file

Если текущая строка начинается и заканчивается на --- и это последняя строка файла, append строка None.В противном случае выведите текущую строку и извлеките следующую, а если она также начинается и заканчивается на ---, , вставьте None и повторите.

1 голос
/ 17 июня 2019

Использование awk

awk '{
        if($0 ~ /^-{3}/){
            if(header==1){
                print "None"
            }; 
            header = 1
        }else{
            header = 0
        }
     }1
     END{
        if(header){
            print "None"
        }
     }' <input>

Короче:

awk '!/^-{3}/{header=0;print;next}header{print "None"}{header=1}1;END{if(header){print "None"}}' <input>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...