sed:从文件中删除字母数字单词

Posted

技术标签:

【中文标题】sed:从文件中删除字母数字单词【英文标题】:sed: removing alphanumeric words from a file 【发布时间】:2010-12-13 20:30:12 【问题描述】:

我有很多文本的文件,我想做的是删除所有字母数字单词。

Example of words to be removed:

gr8  
2006  
sdlfj435ljsa  
232asa  
asld213  
ladj2343asda
asd!32  

我能做到这一点的最佳方法是什么?

【问题讨论】:

【参考方案1】:

如果要删除所有由字母和数字组成的单词,只留下由所有数字或所有字母组成的单词:

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】:

假设您希望从示例文本中得到的唯一输出是 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

【讨论】:

使用;/^$/d' 命令会清理输出。例如sed '/[[:alpha:]]\+//[[:digit:]]\+/s/.*//g' alnum 将在单行上返回2006alpha 欣赏评论。将近 5 年没有看过这个答案,但现在我已经根据您的评论查看了它,我删除了该行,而不是用空行替换它。 干得好,甚至删除了命令链。我印象深刻,同时也学到了一些新东西。 +1【参考方案3】:

如果目标实际上是删除所有字母数字单词(完全由字母和数字组成的字符串),那么这个sed 命令将起作用。它将所有字母数字字符串替换为空。

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

请注意,除alnum 之外的其他字符类也可用(请参阅man 7 regex)。

对于您给定的示例数据,这仅留下 6 个空行和一个 !(因为这是示例数据中唯一的非字母数字字符)。这真的是你想要做的吗?

【讨论】:

【参考方案4】:

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 indata.txt, you have to invokeawk` 中有这个脚本,如下所示:

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

希望对您有所帮助。 祝你好运!

【讨论】:

以上是关于sed:从文件中删除字母数字单词的主要内容,如果未能解决你的问题,请参考以下文章

从df.columns单词中的文本中删除非英语单词包含字母和数字

如何在 shell 脚本中使用 sed 从文件的每一行中删除单词? [复制]

Sed:以/etc/passwd文件为模板

sed 查找和删除单个单词

Prolog DCG从字母数字字符构建/识别单词串

如何使用shell将文件中单词首字母转换为大写