之间的所有文本,但只有那些在 {
和 }
的某个地方进一步找到 A 和 Z 的文本。
下面是一个示例文件:
Once upon a AtimeZ, a mouse climbed up a tree.
Once at {the }top of AaZ {treeA, Zhe AfoundZ an apple.}
"Oh, this {is a Anice Zapple,"A saidZ the} AmouseZ.
The mouse ate {the AappleZ} happily.
输出如下所示:
,
found
nice
said
apple
- 该文件不包含嵌套的
{
或}
。 {
和}
永远不会拆分为多行。{
和}
永远不会出现在"A"和"Z"之间。
我修改了一些代码 如何查找 BASH 中出现在"\word{}"之间的所有单词?,如下所示:
grep -Po "(?<={.*A)[^Z.*}]*(?=Z.*})" found.csv1 > found.csv2
这将打印此错误:
grep: lookbehind assertion is not fixed length
如何输出在 A 和 Z 之间找到的所有文本的列表,并将每个匹配的文本打印到新行,但前提是 A 和 Z 之间的文本在同一行上进一步找到 {
和 }
?
使用两个grep
命令可以更清楚:
grep -Po '(?<={)[^}]*' file | grep -Po '(?<=A)[^Z]*'
解释
首先,在括号之间获取字符串:
$ grep -Po '(?<={)[^}]*' file
the
treeA, Zhe AfoundZ an apple.
is a Anice Zapple,"A saidZ the
the AappleZ
然后通过管道获取 A-Z 之间的文本:
$ grep -Po '(?<={)[^}]*' a | grep -Po '(?<=A)[^Z]*'
,
found
nice
said
apple
这个 grep 可以在单个正则表达式中做到这一点:
grep -Po 'AK[^Z]*(?=Z)(?=[^{}]*})' file
,
found
nice
said
apple
否则,这也适用于 lookback:
grep -Po '(?<=A)[^Z]*(?=Z)(?=[^{}]*})' file
也许效率有点低,但应该可以工作:
grep -Po '{[^}]*A[^}]*Z.*}' found.csv1 | grep -oP '(?<=A).*?(?=Z)'
哈哈,这对我来说涉及很多修补,但我喜欢这个问题,看看这是否适合您。
它看起来是重复的( sed | grep | cut ),因为它分两步完成工作:
- 仅隔离 {} 之间的文本
- 隔离可用区之间的文本
cat text | sed 's/{/n/g' | grep "}" | cut -d "}" -f 1 | sed 's/A/n/g' | grep "Z" | cut -d "Z" -f 1