Como todos sabemos, sedes en gran medida eficiente para buscar y reemplazar la cadena, por ejemplo hallazgo 'a' y reemplazarlo con 'b': sed 's/a/b/g'.
¿Es posible hacer esto con otro comando o script de shell en lugar de sed?
Esto es para un sistema Linux recortado para TV que no tiene el sedcomando. Entonces tengo que usar otros comandos o scripts en lugar desed 's/a/b/g'. –
shell
text-processing
binghenzq
fuente
fuente

$var=~s/a/b/g,gsub(/a/,"b",var),var.gsub(/a/,'b'),var.replace(/a/g,'b'),preg_replace("/a/","b",$var),regsub -all a b $var. Además de eso, muchas herramientas e idiomas también pueden reemplazar cadenas de texto sin formato. Entonces su pregunta es de alguna manera amplia.Respuestas:
Sí, hay una variedad de formas de hacer esto. Puede usar
awk,perlobashpara hacer estas actividades también. Sin embargo, en generalsedes probablemente la herramienta más adecuada para realizar este tipo de tareas.Ejemplos
Digamos que tengo estos datos de muestra, en un archivo
data.txt:awk
Perl
Edición en línea
Los ejemplos anteriores también pueden modificar directamente los archivos. El ejemplo de Perl es trivial. Simplemente agregue el
-iinterruptor.Porque
awkes un poco menos directo pero igual de efectivo:Este método crea un sub-shell con las llaves '{...}' donde el archivo se redirige a él a través de esto:
Una vez que el archivo ha sido redirigido al subconjunto, se elimina y luego
awkse ejecuta contra el contenido del archivo que se leyó en los subconjuntos STDIN. Este contenido se procesaawky se vuelve a escribir en el mismo nombre de archivo que acabamos de eliminar, reemplazándolo efectivamente.fuente
sedno I. Sed es la herramienta adecuada para realizar sustituciones como esta, y obviamente está pidiendo comprender mejor los roles de estas herramientas, por lo que mostrarle a alguien estas cosas aunque sea malo, es extremadamente educativo para mostrar ellos por qué. Demasiadas veces la gente en el saber simplemente dice "no lo hagas" sin explicar por qué, así que lo estoy. Pero gracias por al menos dejar un comentario de por qué DV.La alternativa clásica para las sustituciones de una sola letra es el
trcomando que debería estar disponible en casi cualquier sistema:tres mejor quesedpara esta realidad ya que el usosed(y mucho menosperloawk) para las sustituciones de una sola letra es como usar un martillo para matar una mosca.grepno está diseñado para esto, no modifica su entrada, solo busca a través de ella.Alternativamente, puede usar las capacidades de sustitución de algunos shells. Aquí usando
ksh,zshobashsintaxis:Podríamos darle respuestas más específicas si explica exactamente qué problema está tratando de resolver.
fuente
${foo//a/b}?echo "$foo" | sed 's/a/b/io dar una clase de caracteres:echo ${foo//[aA]/b}.Puede usar Vim en modo Ex:
%seleccione todas las líneasssustituirgreemplazo globalxguardar y cerrarfuente
Si está trabajando con un archivo en lugar de una secuencia, puede usar el editor de texto estándar
ed:Esto debería estar disponible en cualquier * nix. La coma en
',s/a/b/g'le diceedque trabaje en cada línea (también puede usar%, lo que le resultará más familiar si está acostumbrado a vim), y el resto es una búsqueda y reemplazo estándar.wle dice que escriba (guarde) el archivo,qle dice que salga.Tenga en cuenta que, a diferencia de la
-iopción de sed (y opciones similares en otras herramientas), esto realmente edita el archivo en el lugar en lugar de hacer trampa con archivos temporales.No creo que sea posible hacer que esto funcione con transmisiones, pero en realidad no sé mucho
edy no me sorprendería si realmente tiene esa capacidad (la filosofía de Unix es lo que es).fuente
Usando el comando ancestor ed (en el que
-ssignifica quiet (silent) y la coma antes de los comandos significa ejecutar en todas las líneas):Solo imprimiendo en STDOUT :
reemplazo en el lugar:
fuente