Tú pediste sed,pero ed
tambié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 s
edite silenciosamente el archivo input
con dos comandos:
5
, menos dos líneas y terminando en la línea que coincide con la expresión regular 5
, más dos líneas, d
elimine ese rango (separados con un ANSI -salto de línea escapado$'\n'
)
w
grabe el archivo de nuevo en el disco 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;$!d
y 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.