Удалите все строки, содержащие определенную подстроку между начальной и конечной позициями

#linux #bash #sed

#linux #баш #sed

Вопрос:

Мне нужно удалить все строки в данном файле, содержащие слово le , если оно появляется между 3-й и 10-й позицией (символом).

Я много искал по этому поводу и не смог найти ничего о том, как определить начальную и конечную позиции

Это моя sed команда:

 sed '/^.{3}le.{10}/d' file-name
 

Ответ №1:

Вы можете использовать

 sed '/^.{3}.{0,5}le/d' filename
 

Регулярное выражение POSIX BRE означает:

  • ^ — начало строки
  • .{3} — любые три символа
  • .{0,5} — любые символы от нуля до пяти
  • le le подстрока.

Итак, 3 5 равно 8, а le длина равна 2, поэтому шаблон удаляет только строки, которые содержат le между третьей и десятой позициями.

Вы также можете использовать awk :

 awk '!index(substr($0,4,6), "le")' filename
 

Здесь,

  • substr($0,4,6) — возвращает подстроку из 6 символов, начинающуюся с четвертого символа
  • !index(..., "le") — возвращает true , если приведенная выше подстрока не содержит le .