una power personalizar patron modificar hecho guardar diseño diapositivas diapositiva crear como cambiar shell sed

shell - power - ¿Cómo insertar una nueva línea en frente de un patrón?



diseño de diapositivas power point 2010 (16)

Algunas de las otras respuestas no funcionaron para mi versión de sed. Cambiar la posición de & y /n funcionó.

sed ''s/regexp//n&/g''

Editar: Esto no parece funcionar en OS X, a menos que instale gnu-sed .

No cómo insertar una nueva línea antes de una línea. Esto es preguntar cómo insertar una nueva línea antes de un patrón dentro de una línea.

Por ejemplo,

sed ''s/regexp/&/n/g''

insertará una nueva línea detrás del patrón de expresiones regulares.

¿Cómo puedo hacer lo mismo pero delante del patrón?

Aquí hay un archivo de entrada de ejemplo

somevariable (012)345-6789

Debe convertirse

somevariable (012)345-6789


Después de leer todas las respuestas a esta pregunta, aún me costó muchos intentos de obtener la sintaxis correcta para el siguiente script de ejemplo:

#!/bin/bash # script: add_domain # using fixed values instead of command line parameters $1, $2 # to show typical variable values in this example ipaddr="127.0.0.1" domain="example.com" # no need to escape $ipaddr and $domain values if we use separate quotes. sudo sed -i ''$a //n''"$ipaddr www.$domain $domain" /etc/hosts

La secuencia de comandos agrega una nueva línea /n seguida de otra línea de texto al final de un archivo con un único comando sed .


En este caso, no uso sed. Yo uso tr.

cat Somefile |tr '','' ''/012''

Esto toma la coma y la reemplaza con el retorno de carro.


En mi mac, lo siguiente inserta una sola ''n'' en vez de una nueva línea:

sed ''s/regexp//n&/g''

Esto reemplaza con nueva línea:

sed "s/regexp///`echo -e ''/n/r''`/g"


En sed, no puede agregar nuevas líneas en la secuencia de salida fácilmente. Necesita usar una línea de continuación, que es incómoda, pero funciona:

$ sed ''s/regexp// &/''

Ejemplo:

$ echo foo | sed ''s/.*// &/'' foo

Mira here para más detalles. Si quieres algo un poco menos incómodo, podrías intentar usar perl -pe con grupos de coincidencias en lugar de sed:

$ echo foo | perl -pe ''s/(.*)//n$1/'' foo

$1 refiere al primer grupo coincidente en la expresión regular, donde los grupos están entre paréntesis.


Esto funciona en bash , probado en Linux y OS X:

sed ''s/regexp//'$''/n/g''

En general, para $ seguido de un literal de cadena en comillas simples, bash realiza una sustitución de barra inversa de estilo C, por ejemplo, $''/t'' se traduce en una pestaña literal. Además, sed quiere que su literal de nueva línea sea escapado con una barra invertida, de ahí el / before $ . Y, por último, el signo de dólar en sí no debe ser citado para que sea interpretado por el intérprete de órdenes, por lo tanto, cerramos la cotización antes de $ y luego la abrimos nuevamente.

Editar : Como se sugiere en los comentarios de @ mklement0, esto también funciona:

sed $''s/regexp////n/g''

Lo que ocurre aquí es que todo el comando sed ahora es una cadena de estilo C, lo que significa que la barra diagonal que sed requiere colocar antes de que el nuevo literal de línea se escape ahora con otra barra invertida. Aunque es más legible, en este caso no podrás hacer sustituciones de cadenas de shell (sin volver a ponerlo feo).


Esto funciona en MAC para mí

sed -i.bak -e ''s/regex/xregex/g'' input.txt sed -i.bak -e ''s/qregex//'$''/nregex/g'' input.txt

Dono si es perfecto ...


Hmm, las líneas nuevas escapadas parecen funcionar en versiones más recientes de sed (tengo GNU sed 4.2.1),

dev:~/pg/services/places> echo ''foobar'' | sed -r ''s/(bar)//n/1/;'' foo bar


In vi en Red Hat, pude insertar retornos de carro utilizando solo el caracter / r. Creo que esto ejecuta internamente ''ex'' en lugar de ''sed'', pero es similar y vi puede ser otra forma de realizar ediciones en bloque, como parches de código. Por ejemplo. Estoy rodeando un término de búsqueda con una declaración if que insiste en los retornos de carro después de las llaves:

:.,$s//(my_function(.*)/)/if(!skip_option){/r/t/1/r/t}/

Tenga en cuenta que también hice insertar algunas pestañas para que las cosas se alineen mejor.


Para insertar una nueva línea en la secuencia de salida en Linux, utilicé:

sed -i "s/def/abc///ndef/" file1

Donde file1 fue:

def

Antes del reemplazo in situ sed, y:

abc def

Después del reemplazo sed en el lugar. Tenga en cuenta el uso de ///n . Si los patrones tienen un " dentro de él, escapa usando /" .


Puede usar perl one-liners como lo hace con sed, con la ventaja de soporte de expresión regular completo perl (que es mucho más poderoso que lo que obtiene con sed). También hay muy poca variación en las plataformas * nix: el perl generalmente es perl. Entonces puede dejar de preocuparse por cómo hacer que la versión de sed de su sistema particular haga lo que quiera.

En este caso, puedes hacer

perl -pe ''s/(regex)//n$1/''

-pe pone perl en un ciclo de "ejecutar e imprimir", muy parecido al modo de funcionamiento normal de sed.

'' cita todo lo demás para que el caparazón no interfiera

() rodea a la expresión regular es un operador de agrupamiento. $1 en el lado derecho de la sustitución imprime lo que haya coincidido dentro de estos parens.

Finalmente, /n es una nueva línea.

Independientemente de si usa paréntesis como operador de agrupación, debe escapar de cualquier paréntesis con el que intente coincidir. Entonces, una expresión regular que coincida con el patrón que lista más arriba sería algo así como

/(/d/d/d/)/d/d/d-/d/d/d/d

/( o /) coincide con un paréntesis literal, y /d coincide con un dígito.

Mejor:

/(/d{3}/)/d{3}-/d{4}

Me imagino que puedes descubrir qué hacen los números con llaves.

Además, puede usar delimitadores que no sean / para su expresión regular. Entonces, si necesitas unir / no necesitarás escapar. Cualquiera de los siguientes es equivalente a la expresión regular al comienzo de mi respuesta. En teoría, puedes sustituir cualquier carácter por el / los estándar / s.

perl -pe ''s#(regex)#/n$1#'' perl -pe ''s{(regex)}{/n$1}''

Sugerencia de bonificación: si tiene instalado el paquete pcre, viene con pcregrep , que usa expresiones regulares completas compatibles con Perl.


También puede hacer esto con awk, usando -v para proporcionar el patrón:

awk -v patt="pattern" ''$0 ~ patt {gsub(patt, "/n"patt)}1'' file

Esto verifica si una línea contiene un patrón dado. Si es así, agrega una nueva línea al comienzo de la misma.

Vea un ejemplo básico:

$ cat file hello this is some pattern and we are going ahead bye! $ awk -v patt="pattern" ''$0 ~ patt {gsub(patt, "/n"patt)}1'' file hello this is some pattern and we are going ahead bye!

Tenga en cuenta que afectará a todos los patrones en una línea:

$ cat file this pattern is some pattern and we are going ahead $ awk -v patt="pattern" ''$0 ~ patt {gsub(patt, "/n"patt)}1'' d this pattern is some pattern and we are going ahead


en sed, puedes hacer referencia a los grupos en tu patrón con "/ 1", "/ 2", ... así que si el patrón que estás buscando es "PATTERN", y quieres insertar "ANTES" delante de él , puedes usar, sin escaparse

sed ''s/(PATTERN)/BEFORE/1/g''

es decir

sed ''s//(PATTERN/)/BEFORE/1/g''


echo one,two,three | sed ''s/,// /g''


echo pattern | sed -E -e $''s/^(pattern)////n//1/''

funcionó bien en El Captitán con () soporte


sed -e ''s/regexp//0/n/g''

/ 0 es el nulo, por lo que su expresión se reemplaza por nulo (nada) y luego ...
/ n es la nueva línea

En algunos sabores de Unix no funciona, pero creo que es la solución a su problema.

echo "Hello" | sed -e ''s/Hello//0/ntmow/g'' Hello tmow