linux sed удалить блок кода с переносом строки - PullRequest
0 голосов
/ 31 января 2020

Попытка удалить весь этот блок кода из сценария:

https://pastebin.com/gBnFBQSR

Я могу сделать это вплоть до разрыва строки и до ее окончания}

sed '/var gfjfgjk/,/appendChild(s);\n}/d'

как я могу включить перевод строки и} в конце

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

С sed, не могли бы вы попробовать следующее:

sed '
:l      # define a label "l"
N       # read next line and append to the pattern space
$!b l   # goto "l" unless eof
s/var gfjfgjk.*appendChild(s);\n}//
        # remove the specified block including newlines
' file

Сначала все строки в шаблоне пропадают, чтобы мы могли обрабатывать сразу несколько строк (включая символы новой строки).

Возможная проблема заключается в том, что если файл содержит шаблон appendChild(s);\n} в несколько строк, sed попадет в longest match из-за greedy природы регулярного выражения.

В качестве альтернативы , если perl является вашим вариантом, вы также можете сказать:

perl -0777 -pe 's/var gfjfgjk.*?appendChild\(s\);\n}//s' file
  • Опция -0777 говорит perl прочитать все строки сразу.
  • регулярное выражение .*? разрешает совпадение shortest.
  • Опция s в конце делает точку . совпадением с новой строкой. В противном случае точка в perl регулярном выражении не соответствует символу новой строки.
0 голосов
/ 31 января 2020

Благодаря ссылке @Wiktor Stribiżew:

for i in $(grep -rl gfjfgjk) ; do if grep -m1 gfjfgjk $i >/dev/null 2>&1 ; then echo $i ; sed -i -e '1,6d;7s/^}//' $i ; fi; done

Единственное отличие состоит в том, что я хотел убедиться, что gfjfgjk соответствует первой строке файла на случай, если он был введен где-то еще в сценарии, а затем sed удалил первые 7 строк кода le git.

...