![需要匹配一个字符串,然后打印下一个字符串匹配项并继续直到下一个字符串](https://linux22.com/image/975445/%E9%9C%80%E8%A6%81%E5%8C%B9%E9%85%8D%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E7%84%B6%E5%90%8E%E6%89%93%E5%8D%B0%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E9%A1%B9%E5%B9%B6%E7%BB%A7%E7%BB%AD%E7%9B%B4%E5%88%B0%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我在处理大型文本文件时遇到了麻烦,
我的示例 f1.txt 有 3000 多行,格式如下
我需要匹配一个字符串,然后将该字符串后面的行与另一个字符串(在本例中为“需要”)匹配,并将这些匹配的行与原始字符串一起打印。
这应该持续到所有字符串都结束。
示例要求如下,您能帮忙吗?
======f1.txt====
String : a
--
==
==
needed line ------------ 100
needed line -------------200
-
String : b
--
==
==
needed line ------------ 500
needed line -------------600
needed line ------------ 700
needed line -------------800
-
String : c
--
==
needed line ------------ 900
===
===
需要产出
a needed line ------------ 100
a needed line -------------200
b needed line ------------ 500
b needed line -------------600
b needed line ------------ 700
b needed line -------------800
c needed line -------------900
答案1
在 awk 中,
awk -F" : " '/^String/ {string = $2}; /^needed/ {print string, $0}' f1.txt
你可以在 sed 中做类似的事情,尽管它不是那么紧凑 - 基本上它使用 sed 的保持空间作为变量的等价物string
。不幸的是,据我所知,在 sed 中没有简单的方法将保留空间添加到模式空间的前面,所以我们必须附加,然后交换顺序:
sed -rn -e '/^String : / {s///;h;}' -e '/^needed/ {G;s/(.*)\n(.*)/\2 \1/;p;}' f1.txt
注意:完整的解决方案可能应该String
在尝试打印之前检查是否已找到并分配 a(以防文件needed
在任何之前包含行String
)。
答案2
以下是执行此操作的示例脚本:http://paste.ubuntu.com/8186522/
我做了一些假设:
- 您的作业将使用 来作为分隔符。我在设置for
:
时利用了这一点。IFS
read
- 您不介意多次查看文件。这可以一次性完成,事实上,这样做可能更容易,具体取决于实现方式。