bash - 如何在 sed 或 grep 中匹配以空格为前缀的嵌套文本
问题描述
我正在尝试使用 sed 或 grep 匹配嵌套文本,包括嵌套文本之前的行。
我正在使用的示例:
pattern3
abcde
fghij
pattern3
pattern1
abcde
fghij
pattern1
pattern1
klmno
pattern1
pattern3
abcde
pattern1
pqrst
patterh3
fghij
请注意,嵌套文本的前缀始终有四 (4) 个空格。此外,匹配模式之后可能有也可能没有嵌套文本。
我对所有pattern1
行感兴趣,以及后面pattern1
以空格开头的行。
我正在寻找的输出是:
pattern1
abcde
fghij
pattern1
pattern1
klmno
pattern1
pattern1
pqrst
我接近了:
sed -n '/^pattern1/,/^pattern1/p' data.txt
但它似乎在右侧pattern1
匹配后跳过嵌套文本,并进入下一次迭代。
我也试过sed -n '/^\"pattern1\"$/,/^\"pattern1\"$/p' data.txt | sed '1d;$d'
没有运气。
解决方案
使用 GNU sed:
sed -n '/pattern1/{p;:x;n;s/^ .*/&/;p;tx}' file
或简化:
sed -n '/pattern1/{p;:x;n;p;/^ /bx}' file
输出:
模式1 abcde 福吉 模式1 模式1 克洛姆诺 模式1 模式1 pqrst
推荐阅读
- c - 对包含字符串的链表进行排序
- android - 在Android中使用客户端ID和客户端密钥的Retrofit2 OAuth2 - 401未经授权的错误
- javascript - 返回具有给定短语(数组)值的键
- amazon-web-services - 在特定时间 XX 小时内启动 EC2,然后终止
- r - 使用全局变量作为列名时使用 data.table 更新列
- cognos - 用于计算运行日期的 Cognos Query
- c - 仅使用 write 函数将 char 转换为 int
- sql - PostgreSQL 中基于星期日的时差
- angular - Angular 单元测试/模拟 forkJoin
- python - 从没有 keras 的数据框创建 TensorFlow 模型