regex - Bash - grep 提取以指定字符串结尾的单词;在找不到匹配项的地方留下空格

标签 regex bash algorithm text grep

这是输入数据:

I/o live/o in/o New/B-geo-loc York/I-geo-loc
I/o live/o somewhere/o in/o space/o
I/o would/o love/o to/o live/o in France/B-geo-loc
This/o is/o my/o home/o
Sanfrancisco/B-geo-loc CA/I-geo-loc is/o a/o great/o place/o to/o live/o

目的是提取所有以“/B-geo-loc”或“/I-geo-loc”结尾的单词,同时留空没有找到匹配的行

尝试在 grep 中使用以下正则表达式,但没有得到所需的输出

grep -o '\w*/B-geo-loc\b \w*/I-geo-loc\b' sourcefile.txt > targetfile.txt  

这是我的正则表达式输出:

New/B-geo-loc York/I-geo-loc
Sanfrancisco/B-geo-loc CA/I-geo-loc

而不是这个期望的输出:

New/B-geo-loc York/I-geo-loc
---blank line---
France/B-geo-loc
---blank line---
Sanfrancisco/B-geo-loc CA/I-geo-loc

谢谢。

最佳答案

如果 grep 不能满足您的要求,则没有真正的义务在这里使用它。下面是在原生 bash 中实现的(不是 POSIX sh——使用 #!/bin/bash shebang,而不是 #!/bin/sh 如果嵌入一个脚本):

while read -r -a words; do
  matches=( )
  for word in "${words[@]}"; do
    [[ $word = */[IB]-geo-loc ]] && matches+=( "$word" )
  done
  printf '%s\n' "${matches[*]}"
done <sourcefile.txt >targetfile.txt

对于一个巨大的输入文件,可能值得使用 ksh93 或 awk 重写,它们中的任何一个都比 bash 具有更好的性能,但是如果您没有花费大量的人工时间坐在那里等待它运行,那就无关紧要了.

关于regex - Bash - grep 提取以指定字符串结尾的单词;在找不到匹配项的地方留下空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39552695/

相关文章:

javascript - 在第一个数字出现时拆分字符串

python - 匹配除某些字符串之外的所有内容

regex - Postgres - 如何拆分和合并?

regex - 强制正则表达式两边都用引号括起来,或者根本不括起来,而不重复表达式

linux - 在文件和文件夹的名称中递归地填充 0

c++ - 函数给出错误的结果

bash - 是否可以将 bash 脚本转换为可执行文件?

linux - 使用 sudo 在单个命令中运行 "who am i"不会返回任何内容

java - 如何降低 "put"函数的时间复杂度

Java TicTacToe MiniMax 递归 AI