【问题标题】:Using grep to find words that have a certain prefix and suffix使用grep查找具有一定前缀和后缀的单词
【发布时间】:2017-01-18 00:00:31
【问题描述】:

我试图弄清楚如何在文件中查找以字母 air 开头并以字母 ne 结尾的某些单词。我想将与之匹配的单词打印到一个名为“excluded”的新文件中。我对这种命令行环境很陌生,所以我有点迷茫。我已阅读手册并找不到解决方案。

我在想一些类似的事情

grep "air" | "ne" textfile.txt

但显然没有成功。

编辑:我想我可以使用^$ 运算符来查找单词开头和结尾的字母,但是我不确定如何使它成为一个命令,所以我可以简单地粘贴输出到一个新文件中。

【问题讨论】:

  • grep '\bair.*?ne\b',基本上。 “[单词边界]air[随机字符]ne[单词边界]”。您的示例 grep 错误。 | 不在您的模式中,因此它是一个 shell 管道,因此您正在运行 grep,它正在等待输入,其输出将通过管道传输到一个名为 ne 的(可能存在的)命令
  • ^$ 用于一行的开头和结尾,而不是一个单词。你的文件每行只有一个字吗?
  • 是的,每行一个字

标签: linux unix command lines


【解决方案1】:

为了将单词打印到新文件中,您需要使用 ">" 运算符将 grep 的输出发送到文件中,因此命令为:

grep '^air.*ne$' textfile.txt > excluded.txt

或者,如果您更喜欢使用管道,可以使用以下方式:

cat textfile.txt | grep '^air.*ne$' > excluded.txt

也可以。当然,这假设您在包含 textfile.txt 的文件夹中。

用于测试数据

airkinglyne\nairlamne\nhelloworld\nairfatne

输出是:

airkinglyne\nairlamne\nairfatne

【讨论】:

  • 如果第一个单词以air开头,第二个单词以ne结尾,这将在同一行查找多个单词。
  • 什么也没找到。我尝试了相同的命令,甚至没有将单词打印到新文件中。没有任何回报
  • 因为每行只有一个单词,请尝试 grep ^air.*ne$ textfile.txt > exclude.txt
  • 仍然没有返回。我不明白为什么 grep 没有回复任何单词。有这个特定前缀和后缀的单词很多,文件只有100万行1字行。
  • 好的,再试一次,我刚刚又做了一次编辑 grep ^air.*ne$ textfile.txt > exclude.txt
【解决方案2】:
grep -o '\bair[^[:space:]]*ne\b' textfile | sort | uniq > excluded

从手册页中,-o 标志“仅打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。”

模式组成如下: 匹配一个单词边缘 (\b) 然后 字符串 'air' 然后 不是空间的东西,然后多次 字符串 'ne' 然后 另一个词边

然后我们排序,以便我们可以使用 uniq(可以使用 sort -u)

这个想法是一个单词是一个单词边缘,后跟多个非空格字符,然后是另一个单词边缘。

这并不完美,因为它匹配的字符通常不是单词的一部分,例如“airfoo_ne”、“air.barne”等,但是一旦你有了想法,就可以改进它。

【讨论】:

  • 为什么是 [^[:space:]]?为什么即使没有空格它也不能工作?
  • 已编辑。使用手册页阅读它。希望它会有所帮助。
猜你喜欢
  • 2012-07-25
  • 2017-01-27
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2023-03-27
  • 2020-04-29
相关资源
最近更新 更多