如何查找/grep string1 和 string2 之间的内容?

Ces*_*ian 3 grep text-processing

我正在尝试从可能随时间变化的长字符串中提取一个值。因此,例如字符串可能看起来像这样

....../filename-1.9.0.3.tar.gz"<....
Run Code Online (Sandbox Code Playgroud)

我想提取的是filename-.tar.gz之间的值,本质上是文件版本(在这种情况下为 1.9.0.3 )。我需要这样做的原因是因为我稍后可能会运行该命令并且该值将是 1.9.0.6 或 2.0.0.2 或完全不同的值。

我怎样才能做到这一点?我目前只使用 grep,但我不介意使用其他实用程序,例如 sed 或 awk 或 cut 或其他任何工具。完全清楚,我只需要提取字符串的文件版本部分,因为它很长(两侧),其他所有内容都需要以某种方式删除。

don*_*sti 5

使用grep -P/ pcregrep,使用正向后视和正向前瞻:

grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
Run Code Online (Sandbox Code Playgroud)

在你的情况替换STRING1filename-,并STRING2\.tar\.gz


如果您无权访问pcregrep和/或grep不支持,-P您可以使用您最喜欢的文本处理工具执行此操作。这是一种便携式方式,ed可为您提供相同的输出:

ed -s infile <<\IN
g/STRING1/s//\ 
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
Run Code Online (Sandbox Code Playgroud)

工作原理:在每次STRING1出现之前添加一个换行符(所以现在每行最多出现一次)然后STRING1.*STRING2删除所有不匹配的行;对其余的我们只保留之间有什么STRING1STRING2打印出结果。

  • 或者 `grep -P -o 'filename-\K.*?(?=\.tar\.gz)'`(使用足够新的 PCRE 版本)。如果每行可能有多个 `.tar.gz`,`.*?` 会比 `.*` 更好。 (2认同)