texto sustituir script reemplazar para linea insertar especiales espacios eliminar completa caracteres caracter blanco sed text-formatting

sustituir - sed: eliminar palabras alfanuméricas de un archivo



sed reemplazar linea completa (4)

Tengo un archivo con mucho texto, lo que quiero hacer es eliminar todas las palabras alfanuméricas.

Example of words to be removed: gr8 2006 sdlfj435ljsa 232asa asld213 ladj2343asda asd!32

¿Cuál es la mejor forma en que puedo hacer esto?


Si desea eliminar todas las palabras que constan de letras y dígitos, solo debe dejar palabras que contengan todos los dígitos o todas las letras:

sed ''s//([[:alpha:]]/+[[:digit:]]/+[[:alnum:]]*/|[[:digit:]]/+[[:alpha:]]/+[[:alnum:]]*/) /?//g'' inputfile

Ejemplo:

$ echo ''abc def ghi 111 222 ab3 a34 43a a34a 4ab3'' | sed ''s//</([[:alpha:]]/+[[:digit:]]/+[[:alnum:]]*/|[[:digit:]]/+[[:alpha:]]/+[[:alnum:]]*/) /?//g'' abc def ghi 111 222


Si el objetivo es en realidad eliminar todas las palabras alfanuméricas (cadenas que constan por completo de letras y dígitos), entonces este comando sed funcionará. Reemplaza todas las cadenas alfanuméricas sin nada.

sed ''s/[[:alnum:]]*//g'' < inputfile

Tenga en cuenta que otras clases de caracteres además de alnum también están disponibles (vea man 7 regex ).

¡Para sus datos de ejemplo dados, esto deja solo 6 líneas en blanco y una sola ! (dado que ese es el único carácter no alfanumérico en los datos de ejemplo). ¿Esto es realmente lo que estás tratando de hacer?


Solución AWK :

BEGIN { # Statement that will be executed once at the beginning. FS="[ /t]" # Set space and tab characters to be treated as word separator. } # Code below will execute for each line in file. { x=1 # Set initial word index to 1 (0 is the original string in array) fw=1 # Indicate that future matched word is a first word. This is needed to put newline and spaces correctly. while ( x<=NF ) { gsub(/[ /t]*/,"",$x) # Strip word. Remove any leading and trailing white-spaces. if (!match($x,"^[A-Za-z0-9]*$")) # Print word only if it does not match pure alphanumeric set of characters. { if (fw == 0) { printf (" %s", $x) # Print the word offsetting it with space in case if this is not a first match. } else { printf ("%s", $x) # Print word as is... fw=0 # ...and indicate that future matches are not first occurrences } } x++ # Increase word index number. } if (fw == 0) # Print newline only if we had matched some words and printed something. { printf ("/n") } }

Suponiendo que tiene este script en script.awk'' and data in data.txt , you have to invoke awk` como este:

awk -f ./test.awk ./data.txt

Para su archivo producirá:

asd!32

Para casos más complejos como este:

gr8 2006 sdlfj435ljsa 232asa he!he lol asld213 f ladj2343asda asd!32 ab acd!s

... producirá esto:

he!he asd!32 acd!s

Espero eso ayude. ¡Buena suerte!


Suponiendo que el único resultado que quería de su texto de muestra es 2006 y tiene una palabra por línea:

sed ''/[[:alpha:]]/+/{/[[:digit:]]/+/d}'' /path/to/alnum/file

Entrada

$ cat alnum gr8 2006 sdlFj435ljsa 232asa asld213 ladj2343asda asd!32 alpha

Salida

$ sed ''/[[:alpha:]]/+/{/[[:digit:]]/+/d}'' ./alnum 2006 alpha