Al usarlo sed
, a menudo creo expresiones regulares bastante complicadas e intrincadas que necesito hacer coincidir dos veces en un archivo. ¿Hay alguna manera de guardar esta expresión regular y hacer referencia a ella dos veces?
Tal vez algo que se parece a esto?
sed ' complicated_regex=/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+$/
s/complicated_regex:complicated_regex/simple-output/
' my_file
Actualización: una respuesta ha presentado la solución de usar una variable bash. Esto no funciona Dado a test.txt
.
#test.txt
foo bar
bar foo
Y el guion
#!/bin/bash
VALUE='foo \([a-z]\+\)'
sed 's/"${VALUE}"/foo happy \1/' test.txt
Esto debería producir la salida
foo happy bar
bar foo
Pero en cambio obtengo el error
sed: -e expression #1, char 24: invalid reference \1 on `s' command's RHS
sed
regular-expression
Cory Klein
fuente
fuente
perl -pe 's/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+:\1$/simple_output/' my_file
sed 's/'"${VALUE}"'/foo happy \1/' test.txt
Respuestas:
Puede usar variables de shell:
No estoy seguro de lo que quisiste decir
$i
, pero es posible que necesites ponerlo fuera de las comillas simples:fuente
sed
comando se invoca desde el shell, pero hay una solución similar con casi todos los lenguajes de programación. (Y no creo que sea posible usar variables dentrosed
).s/$complicated_regex/\1/
da un error que dice que es una referencia inválida.sed "s/^${complicated_regex}:${complicated_regex}\$/simple-output/" my_file
La forma más fácil de colocar un valor de variable de shell
sed
y no preocuparse de cómo tendrá que cambiar su escape de barra invertida para el resto de sused
secuencia de comandos, es poner todo en comillas simples excepto la variable, y ponerlo entre comillas dobles.Todos los siguientes ejemplos de código asumen:
VALUE='foo \([a-z]\+\)'
El siguiente código roto falla porque la variable
VALUE
no se expande:El siguiente código roto falla porque la barra invertida
\1
se come por el shell (porque está entre comillas dobles en lugar de comillas simples) antes desed
verlo:El siguiente código funciona como se esperaba:
El siguiente código también funciona:
También lo siguiente:
¿Pero por qué complicarse? Las comillas simples alrededor de un
sed
script hacen que todo sea mucho más claro, especialmente para los gurús que no utilizan shell que leen su código. Mi forma preferida es, una vez más, abandonar las comillas simples entre comillas dobles solo para la expansión variable y volver directamente a las comillas simples:fuente