在Sed中正则表达式空格字符

19

我已经尝试了几乎所有的方法(我想),但是没有任何效果。(操作系统:Ubuntu 12.04)

需要匹配的表达式(从文本文件中删除):

a c 4
a k 23
o s 1

我尝试过:

's/[[a-z][:space:][a-z][:space:][0-9]]\{1,\}//gi'
's/.\s.\s[0-9]+//g'
's/[:alpha:][:space:][:alpha:][:space:][:digit:]+'
3个回答

26

这应该匹配:

sed 's/[a-z][ ]*[a-z][ ]*[0-9]*//gi'

你的第一次尝试缺少几个方括号,并且不需要最外层的方括号:

sed 's/[a-z][[:space:]][a-z][[:space:]][0-9]\{1,\}//gi' input

你的第二个示例失败了,因为你需要转义 +,而且即使这样,它也只能在 GNU sed 中工作:

sed 's/.\s.\s[0-9]\+//g' input

还有一些与上一个问题类似的问题:

sed 's/[[:alpha:]][[:space:]][[:alpha:]][[:space:]][[:digit:]]\+//' input

2

中间的那个 接近!你需要转义加号,但我不知道原因。 我还用 "[a-z]" 替换了句点 ".",这样它只匹配字母。

sed 's/[a-z]\s[a-z]\s[0-9]\+//g'

为老版本的sed(嗨,Mac用户!)提供额外的便携式版本。一些sed实现对“+”非常挑剔:

sed 's/[a-z]\s[a-z]\s[0-9][0-9]*//g'

1

[...] 定义了一个字符类。 [a-z] 匹配从 az 的任何字符。要匹配连续的字符,您必须为每个使用一个类:[a-z][[:space:]][a-z]

要使 + 具有特殊含义,您必须对其进行反斜杠转义:[0-9]\+

命名字符类仅在字符类内部有效,即 [[:alpha:]][[:space:]]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接