0

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

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...

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

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

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

提前致谢!

4

6 回答 6

1

这应该做你需要的。

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

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

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

grep -Po '[\w#]*(?=/)' NPs > test
于 2013-10-04T04:14:13.487 回答
0

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

为了让你的输出在不同的行上,这对我有用:

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

这连续使用两个 sed 来执行不同的替换,并tr插入换行符。

-o如另一个答案中所述, grep 中的选项可能更简单!

于 2013-10-04T04:14:00.167 回答
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
于 2013-10-04T05:24:21.360 回答
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
于 2013-10-04T04:27:28.727 回答
0

grep 变体从文本中提取整行,如果它们匹配模式。如果你需要修改行,你应该使用sed,比如

cat NPs | sed 's/^\(\b\w*[#][1-9]\).*$/\1/g'
于 2013-10-04T04:11:14.817 回答
0

你需要sed,不是grep。(或awk,或perl。)看起来这会做你想要的:

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

或者干脆

sed 's?/.*??' NPs

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

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

于 2013-10-04T04:12:38.160 回答