Shell:在不同行的两个字符串之间选择匹配文本

aemubtdh  于 2023-03-24  发布在  Shell
关注(0)|答案(4)|浏览(223)

我希望能够选择在两行上找到的两个字符串之间的所有文本。一些复杂的细节:

  • 其中一个字符串是简单文本(例如,“match me”)
  • 其中一个字符串是文档字符串符号(“"”)
  • 这两个字符串将不会在行的开头找到(如果你把空格算在内的话)

例如:

match me: XXXXX
         I want this
         I want this
         I want this
     """

我最好
1.获取两个字符串之间的文本,
1.删除空白和
1.把绳子自己拿掉
例如,理想输出:

I want this
I want this
I want this

如能就如何做到这一点提供指导,将不胜感激。
我尝试过使用awk和sed的各种解决方案,但无法只匹配满足上述所有条件的文本。

vnjpjtjt

vnjpjtjt1#

使用任何POSIX awk:

$ awk '{sub(/^[[:space:]]+/,"")} f{if (/^"""/) f=0; else print} /^match me/{f=1}' file
I want this
I want this
I want this

我猜测你的一些要求,请看我的评论。如果你的输入中只有一个这样的块,你可以将f=0改为exit以提高效率。

v2g6jxz6

v2g6jxz62#

就像这样:

$ awk '/match/{p=1;next} /"""/{exit}p{sub(/ */, "")}p' file
I want this
I want this
I want this
vi4fp9gy

vi4fp9gy3#

使用GNU sed:

sed '/match me/,/"""/{/match me/d; /"""/d; s/^ *//}' file

输出:

I want this
I want this
I want this
jqjz2hbq

jqjz2hbq4#

这可能对您有用(GNU sed):

sed -n '/^\s*match me/{:a;n;/^\s*"""/b;p;ba}' file

通过设置-n关闭隐式打印。
匹配一行开头白色,后跟match me,然后获取下一行。
如果提取的行与"""后面的空白匹配,则中断并不执行进一步处理。
否则,打印当前行并获取下一行,并如上所述进行处理。
注意:n通常打印当前行并获取下一行。然而,当与-n选项一起使用时,打印被抑制。这里还解释了使用b命令的控制流。

相关问题