正则表达式与grep

时间:2013-10-04 04:00:23

标签: regex bash grep

所以我有一堆数据看起来像这样:

janitor#1/2 of dorm#1/1
president#4/1 of class#2/2
hunting#1/1 hat#1/2
side#1/2 of hotel#1/1
side#1/2 of hotel#1/1
king#1/2 of hotel#1/1
address#2/2 of girl#1/1
one#2/1 in family#2/2
dance#3/1 floor#1/2
movie#1/2 stars#5/1
movie#1/2 stars#5/1
insurance#1/1 office#1/2
side#1/1 of floor#1/2
middle#4/1 of December#1/2
movie#1/2 stars#5/1
one#2/1 of tables#2/2
people#1/2 at table#2/1

有些行有介词,有些则没有介词,我认为我可以使用正则表达式来清理它。我需要的是每个名词,#符号和以下数字在它自己的行上。因此,例如,第一行输出在最终文件中应如下所示:

janitor#1
dorm#1
president#4
etc...

该列表存储在名为NP的文件中。我这样做的代码是:

cat NPs | grep -E '\b(\w*[#][1-9]).' >> test

但是,当我打开测试时,它与输入文件完全相同。关于我缺少什么的任何输入?它似乎不应该是一个艰难的操作,所以也许我错过了一些关于语法的东西?我在bash中调用的shell脚本中使用此命令。

提前致谢!

6 个答案:

答案 0 :(得分:1)

这应该做你需要的。

-o选项仅显示与PATTERN匹配的匹配行的部分。

grep -Eo '[a-z#]+[1-9]' NPs > test

甚至是-P选项,它将PATTERN解释为Perl正则表达式

grep -Po '[\w#]*(?=/)' NPs > test

答案 1 :(得分:0)

grep变量从文本中提取整行,如果它们匹配模式。如果您需要修改行,则应使用sed,例如

cat NPs | sed 's/^\(\b\w*[#][1-9]\).*$/\1/g'

答案 2 :(得分:0)

您需要sed,而不是grep。 (或awkperl。)看起来这样可以做到你想要的:

cat NPs | sed 's?/.*??'

或只是

sed 's?/.*??' NPs

s表示“替代”。下一个字符是正则表达式之间的分隔符。通常它是“/”,但由于你需要搜索“/”,我用“?”代替。 “”是指任何字符,“*”表示“在我之前的零或更多”。最后两个分隔符之间的任何内容是替换字符串。在这种情况下它是空的,所以你用空字符串替换“/”后跟零个或多个任何字符。

编辑:哦,我现在看到你想提取线上的最后一项。好吧,我确信其他人建议的regexp会起作用。如果这是我的问题,我可能会分两步过滤文件,也许可以将结果从一步传递到下一步,或者使用sed进行多次替换:首先删除“of”和中间空格,并添加换行符,然后按上述方式运行sed。它并不像在一个正则表达式中所做的那样酷,但每一步都更容易理解。为了更加简单和不冷却,使用三个步骤,在第一步中用空格替换“of”。由于其他人提供了完整的解决方案,我不会详细说明。

答案 3 :(得分:0)

Grep默认只搜索文本,所以在你的情况下它会打印匹配的行。我想您要调查sed而不是执行替换。 (而且您不需要cat文件,只需grep PATTERN filename

为了让您的输出分开,这对我有用:

sed 's|/.||g' NPs | sed 's/ .. /=/' | tr "=" "\n"

它连续使用两个seds进行不同的替换,并tr插入换行符。

grep中的-o选项导致它只打印匹配的文本,如另一个答案所述,可能更简单!

答案 4 :(得分:0)

使用grep

$ grep -o "\w*[#]\w*" inputfile
janitor#1
dorm#1
president#4
class#2
hunting#1
hat#1
side#1
hotel#1
side#1
hotel#1
king#1
hotel#1
address#2
girl#1
one#2
family#2
dance#3
floor#1
movie#1
stars#5
movie#1
stars#5
insurance#1
office#1
side#1
floor#1
middle#4
ecember#1
movie#1
stars#5
one#2
tables#2
people#1
table#2

答案 5 :(得分:0)

awk版本:

awk '/#/ {print $NF}' RS="/" NPs
janitor#1
dorm#1
president#4
class#2
hunting#1
hat#1
side#1
hotel#1
side#1
hotel#1
king#1
hotel#1
address#2
girl#1
one#2
family#2
dance#3
floor#1
movie#1
stars#5
movie#1
stars#5
insurance#1
office#1
side#1
floor#1
middle#4
December#1
movie#1
stars#5
one#2
tables#2
people#1
table#2