Tengo un archivo de texto con varias líneas en el siguiente formato:

gatename #outputs #inputs list_of_inputs_separated_by_spaces * gate_id

example: 
nand 3 2 10 11 * G0 (The two inputs to the nand gate are 10 and 11)
or 2 1 10 * G1 (The only input to the or gate is gate 10)

Lo que necesito hacer es cambiar el nombre del contenido de modo que elimine la columna #salidas para que el resultado final sea:

gatename #outputs list_of_inputs_separated_by_spaces * gate_id
nand 2 10 11 * G0
or 1 10 * G1

Intenté usar la función de buscar y reemplazar de Eclipse (el parámetro de búsqueda era una declaración regex que no funcionó), pero terminó estropeando el nombre de la puerta. Estoy considerando usar un script de Python e iterar sobre cada línea del archivo de texto. con lo que necesito ayuda es determinar cuál es la declaración de expresiones regulares apropiada.

0
GobiasKoffi 22 sep. 2009 a las 01:54

5 respuestas

La mejor respuesta

De hecho, puede usar la función de buscar y reemplazar de Eclipse, usando lo siguiente:

Find: ^([a-z]+) \d
Replace with: \1

Básicamente, esto coincide con el nombre de puerta al comienzo de cada línea (^([a-z]+)) seguido de la salida (\d), y lo reemplaza solo con el nombre de puerta coincidente (\1).

1
João Silva 21 sep. 2009 a las 22:14

Esto es básicamente para lo que es la utilidad cut:

cut -d " " -f 1,3-

(actualización: olvidé la opción -f, lo siento)

Esto toma un archivo, considera los campos delimitados por espacios y genera los campos primero, tercero y siguientes.

(Si está en Windows, debería tener estas utilidades de estilo unix de todos modos, pueden ser increíblemente útiles .)

Usando una expresión regular, puede reemplazar (\w+) \d+ (.*) con $1 $2. Algo como:

sed -r -e "s/([^ ]+) [0-9]+ (.*)/\1 \2/" file

O

perl -p -e "s/(\w+) \d+ (.*)/\1 $2/" file
4
Tim Sylvester 21 sep. 2009 a las 23:28

No sé en qué plataforma está utilizando Eclipse, pero si es Linux o tiene Cygwin, ¡el corte es muy rápido!

cut -d" " --complement -f2 $FILE

Esto usará el espacio como delimitador y seleccionará el complemento del segundo campo.

Si realmente quieres usar una expresión regular, puedes hacer algo como esto:

sed -r 's/^ *([^ ]+) +[^ ]+ +(.+)/\1 \2/' $FILE

Podría usar fácilmente la misma expresión en python o perl, por supuesto, pero Mitchel tiene razón: la división es fácil. (A menos que el texto sea extremadamente largo, y perderá tiempo dividiendo innecesariamente otros campos).

0
Cascabel 22 sep. 2009 a las 00:41

Personalmente, si se trata de un documento estructurado, no se moleste con una expresión regular.

Simplemente recorra el archivo, divida el carácter "", luego simplemente omita la segunda entrada.

1
Mitchel Sellers 21 sep. 2009 a las 22:01

Algo como...:

for theline in fileinput.input(inplace=1):
  print re.sub(r'(\w+\s*+)\d+\s+(.*)', r'\1\2', theline),

... debe satisfacer sus necesidades.

2
Alex Martelli 21 sep. 2009 a las 22:04