这是输入数据:
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/