字母之间有多个空格和点

时间:2014-10-22 00:52:06

标签: bash sed filter

目前我正在编写一个脚本来为我读取一些日志,我开始为它添加一些过滤器,因为它们是一个过滤器,可以找到发誓的话语而且我会被卡住。

所以这部分正在发挥作用:

SWEARS=$(echo "g *t *f *o" | sed 's/ /[[:space:]]/g')
cat $LOGFILE | egrep --color='always' -iw $SWEARS

这里会找到人们会坐在哪里' gtfo'无论他们在字母之间放置多少空格。请忽略我必须写' *'在现在每封信之间。

现在,如果人们写g.t.f.o,它将找不到任何东西。 我想出的是

SWEARS=$(echo "g *t *f *o" | sed 's/ /[[[:space:]]|\\.]/g')

但这似乎不起作用。有人可以帮助我,并向我解释为什么它不起作用?

编辑: 让我们假设日志文件有很多行,其中一行是:"我讨厌你g.t..f o" 我希望它找到' g.t..f o'

所以输出将是: 我讨厌你 g.t..f o (大胆的颜色)

它不应该返回任何其他行。

2 个答案:

答案 0 :(得分:0)

我认为你正试图这样做,

$ echo "I hate you g.t..f o" | grep -E '\b[A-Za-z]([ .]+[A-Za-z]\b)+'
I hate you g.t..f o

这会以红色显示g.t..f o

答案 1 :(得分:0)

目前,你有这个:

$ echo "g *t *f *o" | sed 's/ /[[:space:]]/g'
g[[:space:]]*t[[:space:]]*f[[:space:]]*o

这匹配g t f o与字母之间的任意数量的空格。要匹配字母之间的任意数量的空格或句点:

$ echo "g *t *f *o" | sed 's/ /[[:space:].]/g'
g[[:space:].]*t[[:space:].]*f[[:space:].]*o

将此应用于您的样本输入:

$ SWEARS=$(echo "g *t *f *o" | sed 's/ /[[:space:].]/g')
$ echo "I hate you g.t..f o" | egrep --color='always' -iw $SWEARS
I hate you g.t..f o

或者,

$ echo "I hate you g....t  ..f . o" | egrep --color='always' -iw $SWEARS
I hate you g....t  ..f . o