проверить, пуста ли строка до и после строки - PullRequest
1 голос
/ 14 октября 2019

Мне нужно удалить определенные номера строки перед желаемым текстом, но только если строка до и после искомой строки пуста.

Например (номер строки, содержимое)

1    
2
3 Hello
4
5 yellow

в этом случае, если строки до и после строки, содержащей Hello, пусты (строки 2 и 4), я должен удалить строки от 3 до 1.

Я могу удалить строки от 3 до 1, используя команды tac и sedно у меня возникли трудности с положением этого условия.

tac file1|sed -e '/Hello/,+3d'|tac

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

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

 sed ':a;N;s/\n/&/3;Ta;/\n\n.*Hello.*\n$/s/.*\n//;ta;P;D' file      

Соберите 4 строки в пространстве шаблона, и если 2-я и 4-я пустые, а 3-я содержит Hello, удалите первуютри строки и повторите. В противном случае выведите первую строку и повторите.

0 голосов
/ 14 октября 2019

С опцией GNU sed -z вы можете сопоставить

some_line
empty line
line With Hello
empty line

и заменить ее пустой строкой.

sed -rz 's/(^|\n)[^\n]*\n\nHello\n\n/\1\n/g' file1

РЕДАКТИРОВАТЬ: добавлено g для нескольких сегментов.

0 голосов
/ 14 октября 2019

Не могли бы вы попробовать, если вы в порядке с awk.

awk -v string="Hello" '
FNR==NR{
  a[FNR]=$0
  next
}
($0==string) && a[FNR-1]=="" && a[FNR+1]==""{
  a[FNR-1]=a[FNR]=a[FNR-2]="del_flag"
}
END{
  for(i=1;i<=length(a);i++){
    if(a[i]!="del_flag"){
      print a[i]
    }
  }
}
'  Input_file  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...