2011-09-28 12 views
5

Me gustaría saber si hay una forma de hacer reemplazos de expresiones regulares de múltiples capas en bash con $ {cadena // subcadena/reemplazo} o, posiblemente, qué mejor solución existe.reemplazo regex múltiple en variable en bash?

Tengo un script para enviar actualizaciones a StatusNet y friendika con curl. Firmo peticiones en línea, por ejemplo, y me ofrecen tuitearlas, pero prefiero enviarlas a identica. Estoy cansado de pegar cosas y tener que editar en la terminal para escapar @ y #,! y? me gustaría sustituir expresión regular en mi script para cambiar automagicamente

@repbunghole and @SenatorArsehat Stop farking around with #someship! Do you want me to come smack you? | http://someshort.url 

a

\@repbunghole \@SenatorArsehat Stop farking around with \#someship\! Do you want me to come smack you\? \| http://someshort.url 

no tengo fuerte fu sed o awk, pero imagino que pueden ofrecer soluciones, y don No sé cómo usar sed sin escribir la variable en un archivo, leer el archivo y actuar sobre él, luego establecer la var con var = $ (archivo cat). Sí. Soy bastante nuevo en esto. No encuentro datos suficientes con los $ {cadena // subcadena/reemplazo /} anteriores para reemplazos múltiples. Ejecutar esa X veces para escapar X personajes diferentes parece ineficaz.

como

read -p "Enter a string: " a 
b=${a//\@/\\\@} 
c=${b//\#/\\\#} 
d=${c//\!/\\\!} 
e=${d//\?/\\\?} 
f=${e//\"/\\\"} 
g=${f//\'/\\\'} 

etc., etc. trabaja en el ínterin, pero es feo ...

Respuesta

4

de "expresiones regulares múltiple reemplazo en variable en bash? "

both sed y awk pueden hacerlo. por ejemplo quiero reemplazar

a->1 
b->2 
c->3 

con sed:

kent$ v=abc 
kent$ newV=$(sed -e's/a/1/; s/b/2/; s/c/3/' <<< $v) 
kent$ echo $newV2 
123 

con awk:

kent$ v=abc 
kent$ newV2=$(awk '{gsub(/a/,"1");gsub(/b/,"2");gsub(/c/,"3")}1' <<< $v)                 
kent$ echo $newV               
123