Referencia de la espalda -- sed camp askubuntu Relacionados El problema

sed back reference


1
vote

problema

Español

Tengo las siguientes líneas, almacenadas en el archivo de texto TEL2 :

  Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava|926/448/829 Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava|926.443.602   

Mi intención es poner el número de teléfono como el inicio de cada línea, así que lo hice:

  sed 's/(.*13...|[^|]*)(.*)$/21/' tel2.txt   

Solo obtuve el primer grupo como la salida, ignorando el segundo grupo capturado. Pero si pongo un N entre 2 y 1, se produce primero el segundo grupo, y el primero en una nueva línea, por lo que no es el regex. ¿Es el primer grupo que sobrescribe el segundo? ¿Estoy perdiendo algo?

¡Gracias de antemano!

Original en ingles

I have the following lines, stored in the text file tel2:

Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava|926/448/829 Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava|926.443.602 

My intention is to put the phone number as the start of each line, so I did:

sed 's/\(.*13...|[^|]*\)\(.*\)$/\2\1/' tel2.txt 

I got only the first group as the output, ignoring the second captured group. But if I put a \n between \2 and \1, it outputs the second group first, and the first in a new line, so it is not the regex. Is the first group overwriting the second?, am I missing something?

Thanks in advance!

  
   
   

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Sobre la base de los comentarios, el problema es que su archivo tiene terminaciones de línea CRLF de estilo DOS, y su segundo grupo de captura está capturando el CR y moviéndolo al centro del patrón de salida, ya que puede ver usando ABCDEFGHIJKLMNABCDEFGHIJKLMN1 para hacer que las terminaciones de línea explícitas:

  $ sed 's/(.*13...|[^|]*)(.*)$/21/' tel2.txt | cat -et |926/448/829^MHernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava$ |926.443.602^MGomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava$   

Una posible solución sería excluir el CR desde el segundo grupo:

  $ sed 's/(.*13...|[^|]*)(.*) $/21 /' tel2.txt | cat -et |926/448/829Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$ |926.443.602Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$   

(Si no desea finales de estilo DOS en el resultado, omita el ABCDEFGHIJKLMNABCDEFGHIJKLMN4 en el reemplazo).


Sospecho que realmente no desea que el delimitador en la parte delantera: una expresión más sencilla que maneja a los delimitadores de manera más sensata sería

  ABCDEFGHIJKLMNABCDEFGHIJKLMN5   

ex.:

  $ sed 's/(.*)|([^|]*) /2|1 /' tel2.txt | cat -et 926/448/829|Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$ 926.443.602|Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$   
 

Based on comments, the issue is that your file has DOS-style CRLF line endings, and your second capture group is capturing the CR and moving it to the middle of the output pattern, as you can see using cat -et to make the line endings explicit:

$ sed 's/\(.*13...|[^|]*\)\(.*\)$/\2\1/' tel2.txt | cat -et |926/448/829^MHernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava$ |926.443.602^MGomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava$ 

A possible solution would be to exclude the CR from the second group:

$ sed 's/\(.*13...|[^|]*\)\(.*\)\r$/\2\1\r/' tel2.txt | cat -et |926/448/829Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$ |926.443.602Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$ 

(if you don't want DOS-style endings in the result, omit the \r in the replacement).


I suspect you don't really want the delimiter at the front - a simpler expression that handles the delimiters more sensibly would be

sed 's/\(.*\)|\([^|]*\)\r/\2|\1\r/' 

ex.:

$ sed 's/\(.*\)|\([^|]*\)\r/\2|\1\r/' tel2.txt | cat -et 926/448/829|Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$ 926.443.602|Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$ 
 
 

Relacionados problema

1  Reemplace solo ciertos números usando SED [CERRADO]  ( Replace only certain numbers using sed ) 
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas. ...

0  ¿Cómo usar el comando SED para buscar la cadena con "/" personaje en él y reemplazar con alguna otra cadena?  ( How to use of sed command to search string with character in it and replace ) 
He ejecutado el comando: ABCDEFGHIJKLMNABCDEFGHIJKLMN5 En la salida, este comando no reemplaza "http: //" con "www" ¿Por qué? ¿Y cómo cambiar delimita...

2  ¿Cómo eliminar programáticamente las nuevas líneas vacías de un archivo?  ( How to programatically remove empty new lines from a file ) 
Necesito eliminar las nuevas líneas vacías del archivo de texto en el terminal. archivo de ejemplo 123 123 123 123 123 123 He buscado en Google u...

1  SED / AWK - Retire todas las etiquetas, excepto solo dos etiquetas y textos lisos  ( Sed awk remove all tags except only two tags and plain texts ) 
Aquí hay una muestra para mi archivo de texto: <w:r><w:t> <w:r w:rsidR="00D171FD"> <w:t></w:t> </w:r><w:r> <w:t xml:space="preserve"> This is a sample text...

15  Regex con comando SED para analizar el texto JSON  ( Regex with sed command to parse json text ) 
Tengo este texto JSON: { "buildStatus" : { "status" : "ERROR", "conditions" : [{ "status" : "OK", "metr...

4  Cómo encontrar texto y reemplazar esa línea si existe con terminal, de lo contrario, solo agrega la línea para terminar  ( How to find text and replace that line if exists with terminal otherwise just ap ) 
Quiero poner en sudo gedit /etc/sysctl.conf la línea vm.swappiness=10 que a veces cambia. De forma predeterminada, esta línea no existe, por lo que util...

7  ¿Cómo reemplazar las cadenas en el archivo sin regex?  ( How to replace strings in file without regex ) 
Necesito reemplazar algunas cadenas en archivos (desde la línea de comandos), pero no quiero usar sed -i porque mi cadena contiene muchos personajes diverti...

3  Eliminar todo antes de la primera ocurrencia de la palabra especificada  ( Remove everything before first occurence of specified word ) 
¿Cómo puedo eliminar todo antes de la primera ocurrencia de una palabra específica usando sed ? lo que he intentado hasta ahora: echo $(cat /etc/nginx/s...

1  El uso de SED para agregar caracteres al final de una línea agrega una nueva línea  ( Using sed to add characters at the end of a line adds a new line ) 
Estoy haciendo un script para convertir algunas listas de cubierta mágicas de un formato a otro. Necesito insertar el código de configuración para cada tarjet...

4  Retire las cotizaciones alrededor de los enteros en un archivo CSV  ( Remove quotes around integers in a csv file ) 
en un archivo CSV grande (& gt; 1 gb) Tengo algo como "34432", "name", "0", "very long description" pero en lugar de eso me gustaría tener 34432, "n...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos