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