sed: удаление буквенно-цифровых слов из файла - PullRequest
6 голосов
/ 13 декабря 2010

У меня есть файл с большим количеством текста, я хочу удалить все буквенно-цифровые слова

Example of words to be removed:

gr8  
2006  
sdlfj435ljsa  
232asa  
asld213  
ladj2343asda
asd!32  

как мне лучше всего это сделать?

Ответы [ 4 ]

6 голосов
/ 14 декабря 2010

Если вы хотите удалить все слова, состоящие из букв и цифр, оставьте только слова, состоящие из всех цифр или всех букв:

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

Пример:

$ 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
2 голосов
/ 14 декабря 2010

Предполагая, что единственный вывод, который вы хотели получить из вашего образца текста, это 2006, и у вас есть одно слово в строке:

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

Ввод

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

Ввод

$ sed '/[[:alpha:]]\+/{/[[:digit:]]\+/d}' ./alnum
2006
alpha
0 голосов
/ 14 декабря 2010

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")
    }
}

Предполагается, что у вас есть этот скрипт в script.awk' and data in data.txt , you have to invoke awk`, как это:

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

Для вашего файла он выдаст:

asd!32

Для более сложных случаев, подобных этому:

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

... это даст:

he!he
asd!32 acd!s

Надеюсь, это поможет. Удачи!

0 голосов
/ 14 декабря 2010

Если целью является удаление буквенно-цифровых слов (строк, состоящих исключительно из букв и цифр), то эта команда sed будет работать.Он заменяет все буквенно-цифровые строки ничем.

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

Обратите внимание, что доступны и другие классы символов, кроме alnum (см. man 7 regex).

Для данных данного примера это оставляеттолько 6 пустых строк и одна ! (так как это единственный не буквенно-цифровой символ в данных примера).Это на самом деле то, что вы пытаетесь сделать?

...