Como todos sabemos, sed
es 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 sed
comando. 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
,perl
obash
para hacer estas actividades también. Sin embargo, en generalsed
es 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
-i
interruptor.Porque
awk
es 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
awk
se ejecuta contra el contenido del archivo que se leyó en los subconjuntos STDIN. Este contenido se procesaawk
y se vuelve a escribir en el mismo nombre de archivo que acabamos de eliminar, reemplazándolo efectivamente.fuente
sed
no 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
tr
comando que debería estar disponible en casi cualquier sistema:tr
es mejor quesed
para esta realidad ya que el usosed
(y mucho menosperl
oawk
) para las sustituciones de una sola letra es como usar un martillo para matar una mosca.grep
no 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
,zsh
obash
sintaxis: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/i
o dar una clase de caracteres:echo ${foo//[aA]/b}
.Puede usar Vim en modo Ex:
%
seleccione todas las líneass
sustituirg
reemplazo globalx
guardar 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 diceed
que 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.w
le dice que escriba (guarde) el archivo,q
le dice que salga.Tenga en cuenta que, a diferencia de la
-i
opció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
ed
y 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
-s
significa 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