【发布时间】:2020-12-08 23:38:46
【问题描述】:
我之前的问题被标记为“重复”,我被指向this 和this。这些线程上提供的解决方案根本无法解决这个问题。
file.txt 的内容:
Some line of text 0
Some line of text 1
Some line of text 2
PATTERN1
Some line of text 3
Some line of text 4
Some line of text 5
PATTERN2
Some line of text 6
Some line of text 7
Some line of text 8
PATTERN1
Some line of text 9
Some line of text 10
Some line of text 11
PATTERN2
Some line of text 12
Some line of text 13
Some line of text 14
我需要在两者之间提取“PATTERN1”和“PATTERN2”+行,下面的命令可以完美地做到这一点:
awk '/PATTERN1 /,/PATTERN2/' ./file.txt
输出:
PATTERN1 Some line of text 3 Some line of text 4 Some line of text 5 PATTERN2 PATTERN1 Some line of text 9 Some line of text 10 Some line of text 11 PATTERN2
但现在我正在尝试创建一个 bash 脚本:
- 使用 awk 查找 PATTERN1 和 PATTERN2 之间的线
- 将每次出现的 PATTERN1 + 行之间的 + PATTERN2 存储在 一个数组
- 执行 1 和 2 直到文件结束。
澄清一下。表示将以下行存储在引号内:
"PATTERN1
Some line of text 3
Some line of text 4
Some line of text 5
PATTERN2"
致array[0]
并将以下行存储在引号内:
"PATTERN1
Some line of text 9
Some line of text 10
Some line of text 11
PATTERN2"
致array[1]
等等.....如果PATTERN1和PATTERN2的出现次数更多
我目前拥有的:
#!/bin/bash
var0=`cat ./file.txt`
mapfile -t thearray < <(echo "$var0" | awk '/PATTERN1 /,/PATTERN2/')
上述方法不起作用。
并且我尽可能不想使用 mapfile,因为该脚本可能在不支持它的系统上执行。
基于this提供的链接:
myvar=$(cat ./file.txt)
myarray=($(echo "$var0" | awk '/PATTERN1 /,/PATTERN2/'))
但是当我这样做时echo ${myarray[1]}
我得到一个空白回复。
当我这样做时echo ${myarray[0]}
我明白了:
PATTERN1 Some line of text 3 Some line of text 4 Some line of text 5 PATTERN2 PATTERN1 Some line of text 9 Some line of text 10 Some line of text 11 PATTERN2
当我回显${myarray[0]}时我期望什么
PATTERN1 Some line of text 3 Some line of text 4 Some line of text 5 PATTERN2
当我做echo ${myarray[1]}时我期望什么
PATTERN1 Some line of text 9 Some line of text 10 Some line of text 11 PATTERN2
任何帮助都会很棒。
【问题讨论】:
-
让您的 awk 在每个段之后插入一个文字 NUL,然后您可以使用
readarray -d '' arrayname < <(awk ...)填充由这些 NUL 分段的数组。