如何搜索 A 和 Z 之间的所有单词,这些单词在 BASH 中进一步用 { 和 } 括起来


我需要输出出现在 A 和 Z

之间的所有文本,但只有那些在 {} 的某个地方进一步找到 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

相关内容

  • 没有找到相关文章

最新更新