¿Cómo dividir la expresión sed larga en varias líneas?

14
sed 's/[long1][long2]/[long3][long4]/' file.txt

Me gustaría dividir este comando en varias líneas - fx algo como esto:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

Usar \o separar cadenas no funcionó.

Raffael
fuente
Es por eso que Perl tiene el /xmodificador para la sustitución.
choroba
1
@Networker: sí, gracias, también agregué mi respuesta allí
Raffael

Respuestas:

8

Puede guardar una cadena larga en variables bash, luego usar en el sedcomando:

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

Si puede usar perl, puede romper el patrón largo con el xmodificador:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file
Cuonglm
fuente
1
¿Por qué usas tantas citas? sed "s/$string/$replace/" file.txtestá bien.
Scott
1
Además, por supuesto, debe eliminar el espacio después replace=.
Scott
8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

La división en varias líneas con barra invertida funciona si las nuevas líneas no están sangradas.

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

Probado en Cygwin con GNU sed 4.2.2

Raffael
fuente
¿Cuál es tu versión sed? Pruebo con GNU sed version 4.2.1y no funciona.
cuonglm
2
Parece que falta una barra invertida al final de la primera línea, ¿después de la barra?
Volker Siegel
6

Otro aspecto:

¿Cuán mantenibles son los [long]elementos anteriores?

Cuanto más cortas y distintas sean las cláusulas, más fácil será cambiarlas y mejorarlas a medida que pase el tiempo y los hechos (externos) cambien en torno a la función que proporcionan.

p.ej

sed \
-e 's / [minimal-s1] / [minimal-r1] /' \
-e 's / [minimal-s2] / [minimal-r2] /' \
-e 's / [minimal-s3] / [minimal-r3] /' \
-e 's / [minimal-s4] / [minimal-r4] /' 

... podría ser algo por lo que luchar y preferir.

Hannu
fuente
4

También puedes dividir eso de esta manera:

sed '/[long1][long2]/
    s//[long3][long4]/'

O tal vez como:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

O con un heredoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
mikeserv
fuente