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
将在单行上返回2006
和alpha
欣赏评论。将近 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 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
希望对您有所帮助。 祝你好运!
【讨论】:
以上是关于sed:从文件中删除字母数字单词的主要内容,如果未能解决你的问题,请参考以下文章
从df.columns单词中的文本中删除非英语单词包含字母和数字