Удаление диапазона из n строк до и после совпадающей строки в sed?

попробуйте

grep -c -E '[0-9]+' list.txt

где

  • -c означает счетчик
0
11.05.2018, 13:35
2 ответа

Tú pediste sed,pero edtambién puede hacer esto:

$ seq 10 > input
$ ed -s input <<< '/5/ -2, /5/ +2 d'$'\n'w
$ cat input
1
2
8
9
10

Esto le dice a ed que sedite silenciosamente el archivo inputcon dos comandos:

  1. comenzando en la línea que coincide con la expresión regular 5, menos dos líneas y terminando en la línea que coincide con la expresión regular 5, más dos líneas, delimine ese rango

(separados con un ANSI -salto de línea escapado$'\n')

  1. wgrabe el archivo de nuevo en el disco
1
28.01.2020, 02:32

Si las regiones no se superponen, puede usar

sed -zE 's/([^\n]*\n){2}([^\n]*match[^\n]*)(\n[^\n]*){3}/\2/g'

con GNU sed, para eliminar dos líneas antes y tres después de la coincidencia (los valores en el{}).

Con las implementaciones generales sed, no tiene la opción -z, por lo que debe recopilar líneas en el búfer con el esquema H;1h;$!dy no puede hacer "todo menos una nueva línea" con [^\n], por lo que necesita una solución como esta:

sed -E 'H;1h;$!d;x;y/\n#/#\n/;s/([^#]*#){2}([^#]*match[^#]*)(#[^#]*){3}/\2/g;y/\n#/#\n/'

Ambas soluciones funcionan en todo el archivo en el espacio de patrón, así que no utilice esto para archivos grandes.

1
28.01.2020, 02:32

Теги

Похожие вопросы