如何读取特定行并提取以“abc”开头并以“def”结尾的字符串的一部分?

如何读取特定行并提取以“abc”开头并以“def”结尾的字符串的一部分?

我正在尝试打印从“abc”和“def”开始的字符串的一部分示例:

123456789
123abc_fff_def456789
123456789
...

结果:

abc_fff_def

答案1

如果您grep支持-o-P非标准选项:

grep -Po 'abc.*?def' < your-file

请注意,它假设abcdef位于同一行。每行可以报告多个事件。

.*?匹配任意 0 个或多个字符的序列,尽可能少,而.*会匹配越多越好。这会对输入产生影响,例如0abc1def2def3where with .*?,您会得到abc1defwhile with .*,您会得到abc1def2def(以及 on 0abc1def2abc3def4,您会得到abc1defabc3defvs abc1def2abc3def)。

无论如何,在像 之类的输入上0abc1abc2def3,两者都会返回,abc1abc2def因为它匹配为早期的尽可能。

为了能够匹配多行数据,您可以使用perlPingrep -P实际上用于类似 Perl 的正则表达式):

perl -l -0777 -ne 'print for /abc.*?def/gs' < your-file

答案2

使用非常简单的正则表达式,允许和grep之间的任何潜在字符:abcdef

grep -o 'abc.*def' input

答案3

命令

sed "s/[^a-z].[^a-z]//g" file


 grep -o "[a-z].*[a-z]" file

输出

abc_fff_def

答案4

Gnu sed 我们在看到 /def/ 时使用标志作为前缀,在看到 /abc/ 时使用标志作为后缀。然后我们继续疯狂砍伐,直到我们看到 /abc/ 冒泡到模式空间的开头。

$ sed -ne '
    /\n/{/^abc.*def\n/P;D;}
    s/def/&\n/;s/abc/\n&/
    /\n.*\n/D
' file

使用 perl,我们根据模式是否存在为 ORS => $\ 分配适当的值。仅印刷一对

perl -lpe '
  $\    = /(abc.*?def)/ ? $/ : $,;
  $_=$1;
' file

相关内容