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 或其他任何工具。完全清楚,我只需要提取字符串的文件版本部分,因为它很长(两侧),其他所有内容都需要以某种方式删除。
使用grep -P/ pcregrep,使用正向后视和正向前瞻:
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
Run Code Online (Sandbox Code Playgroud)
在你的情况替换STRING1用filename-,并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删除所有不匹配的行;对其余的我们只保留之间有什么STRING1和STRING2打印出结果。