Necesita la facilidad de delimitador anidado que Perl ofrece. Eso permite usar cosas como emparejar, sustituir y transliterar sin preocuparse de que el delimitador esté incluido en sus contenidos. Como perl es un superconjunto de sed, deberías poder usarlo para lo que sea que utilices sed.
Considera:
$ perl -nle 'print if /something/' inputs
Ahora si su something
contiene una barra, tiene un problema. La forma de solucionar esto es cambiar el delimitador, preferiblemente a uno de horquillado. Así, por ejemplo, puede tener lo que quiera en el $ LO variable de shell (siempre los backets están en equilibrio), que consigue interpolada por la cáscara antes de Perl es aún llamado aquí:
$ perl -nle "print if m($WHATEVER)" /usr/share/dict/words
que funciona incluso si tiene paréntesis anidados correctamente en $ WHATEVER. Los cuatro pares de horquillado que anidan correctamente así en Perl son < >
, ()
, [ ]
y { }
. Permiten contenidos arbitrarios que incluyen el delimitador si ese delimitador está equilibrado.
Si es no balanceado, entonces no use un delimitador en absoluto.Si el patrón es una variable en Perl, que no es necesario utilizar el operador encuentro, siempre se utiliza el operador =~
, por lo que:
$whatever = "some arbitrary string (/ # [ etc";
if ($line =~ $whatever) { ... }
Por lo menos, muéstrenos la cadena que está dando a sed que causa el error. –
Las cadenas pasadas en sed pueden contener #,!, /,?, &, @ Y todos los demás caracteres – Unitech