正则表达式:从行尾开始匹配两个/

正则表达式:从行尾开始匹配两个/

我有一个文件路径文件。目录的深度有各种长度和路径名。我想反向匹配两个目录(两个 /)并删除匹配项,并使用结果创建一个新文件。

例如:

/dir1/dir2/dir3/dir4/dir5/dir6/dir7/output_job3344.xml
/dir1/dir2/dir3/dir4/dir5/otherfile.txt

结果是:

/dir1/dir2/dir3/dir4/dir5/dir6/
/dir1/dir2/dir3/dir4/

我尝试了这样的事情:

awk -F'/*./.*$' '{print $0}' deep.list

但没有成功。

答案1

你的想法很聪明,但需要进行一些更正。以下可能是您的意思:

awk -F'[^/]*/[^/]*$' '{print $1}' deep.list

解释:

首先,您可能拼写错误.**.

然后,*修饰符是贪婪的,因此您需要注意不要匹配超出预期的字符!解决方案很简单,尽管可读性稍差:使用[^/]*而不是.*。这样您就可以匹配除 之外的任何字符/

最后,$0代表整行,通过指定特制的自定义字段分隔符,该行丝毫没有改变。在这种情况下,您想打印第一个字段:$1


这是与上述两种方法不同的方法答案链接自@ender.qa

awk '{gsub("[^/]+/[^/]+$","");print}' deep.list

还有一个使用循环的方法:

awk -F/ '{for(i=1;i<=NF-2;i++){printf "%s/",$i}; print ""}' deep.list

替换方法在 Perl 中更容易实现:

perl -lape 's"[^/]+/[^/]+$""' deep.list

或 sed:

sed -E 's"[^/]+/[^/]+$""' deep.list

相关内容