我正在尝试打印从“abc”和“def”开始的字符串的一部分示例:
123456789
123abc_fff_def456789
123456789
...
结果:
abc_fff_def
答案1
如果您grep
支持-o
和-P
非标准选项:
grep -Po 'abc.*?def' < your-file
请注意,它假设abc
和def
位于同一行。每行可以报告多个事件。
.*?
匹配任意 0 个或多个字符的序列,尽可能少,而.*
会匹配越多越好。这会对输入产生影响,例如0abc1def2def3
where with .*?
,您会得到abc1def
while with .*
,您会得到abc1def2def
(以及 on 0abc1def2abc3def4
,您会得到abc1def
和abc3def
vs abc1def2abc3def
)。
无论如何,在像 之类的输入上0abc1abc2def3
,两者都会返回,abc1abc2def
因为它匹配为早期的尽可能。
为了能够匹配多行数据,您可以使用perl
(P
ingrep -P
实际上用于类似 Perl 的正则表达式):
perl -l -0777 -ne 'print for /abc.*?def/gs' < your-file
答案2
使用非常简单的正则表达式,允许和grep
之间的任何潜在字符:abc
def
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