所以我有一堆数据看起来像这样:
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脚本中使用此命令。
提前致谢!
答案 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
。 (或awk
或perl
。)看起来这样可以做到你想要的:
cat NPs | sed 's?/.*??'
或只是
sed 's?/.*??' NPs
s
表示“替代”。下一个字符是正则表达式之间的分隔符。通常它是“/”,但由于你需要搜索“/”,我用“?”代替。 “”是指任何字符,“*”表示“在我之前的零或更多”。最后两个分隔符之间的任何内容是替换字符串。在这种情况下它是空的,所以你用空字符串替换“/”后跟零个或多个任何字符。
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