我有一个文件路径文件。目录的深度有各种长度和路径名。我想反向匹配两个目录(两个 /)并删除匹配项,并使用结果创建一个新文件。
例如:
/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
。
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