使用grep和lookaround从文本中使用斜杠分隔符提取文件名和路径

时间:2014-09-24 18:23:37

标签: regex grep regex-lookarounds

我正在尝试编写一个bash脚本,以便在将本地文件夹与另一个远程文件夹进行比较后自动检查已更改的文件。 为了实现这一点,我试图用远程文件夹的一部分路径提取文件名,以便在checkin命令中使用。我正在寻求有关使用它的路径提取文件名的帮助。

为了实现比较,我使用了diff命令,如下所示

diff --brief --suppress-common-lines -x '*.class' -ar ~/myprojects/company/apps/product/package/test/ $env_var/java/package/test/

上述命令以下列格式打印输出:

  

文件/home/xxxx/myprojects/company/apps/product/package/test/fileName.java和/productdev/product/product121/java/package/test/filename.java不同

我想在'和'之间提取文件名。 '不同'。所以我在grep命令中使用了lookarounds正则表达式:

diff --brief --suppress-common-lines -x '*.class' -ar ~/myprojects/company/apps/product/package/test/ $env_var/java/package/test/ | grep -oP '(?<=and) .*(?=differ)'

给了我:

  

/productdev/product/product121/java/package/test/filename.java

我想显示从java开始到文本末尾的路径,如: java / package / test / filename.java

2 个答案:

答案 0 :(得分:0)

你可以尝试下面的grep命令,

grep -oP 'and.*\/\Kjava.*?(?= differ)'

即,

diff --brief --suppress-common-lines -x '*.class' -ar ~/myprojects/company/apps/product/package/test/ $env_var/java/package/test/ | grep -oP 'and.*\/\Kjava.*?(?=\s*differ)'

答案 1 :(得分:0)

对于我如何看待你,你将获得两个文件夹中的所有文件进行比较,并得到几行,就像你提到的那样。

因此,第一步是将所有“不同”的行涂在其中。 (如果该命令也提供任何其他类型的行)

如果我错了并且理解不正确,你可以忽略上述步骤。

所以下一步是两条路径。为此你可以使用这些:

awk '{print $2,$4}'

这将仅打印第二和第三个字段,即两个路径。 awk打印字段而不管空格。

另一种简单的方法是:

 cut -d" " -f 2,4

这也会做同样的事情。 这里使用“-d”标志我们指定一个分隔符来分隔字符串,使用“-f”标志我们指定要从中选择的字段位数(所以第二和第四个字段)。

一旦你获得这些路径,你总是可以将它们存储在两个变量中,并剪切或取出你想要的任何部分。