从文本文件中混乱的路径中删除文件名 awk 或 sed

从文本文件中混乱的路径中删除文件名 awk 或 sed

我有一个 xml 文件,其中有很多行包含如下内容:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"

我想删除文件名并保留其他所有内容。如下所示:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"

文件名和文件夹名称相差很大,但每个文件的深度相同。因此基本上删除第 7 个 \ 之后的文件名

我对这个正则表达式进行了修改并且它可以工作,但是 xml 其他部分的文件名被删除了:

s/([a-zA-Z0-9_.-]+)\.([a-zA-Z0-9.]{3})$//g

答案1

Perl 方式:

perl -pne 's/^.+\\\K[^"]+//' file
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"

演示与说明

答案2

这将使用 GNU sed 来完成:

    sed 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file

其工作方式如下:

  • \(我记得上面使用和之间的内容\)(这些是捕获组)。
  • 因此,第一个捕获组会记住尽可能多的内容,直到遇到 \\.*\..*- 即一个文字反斜杠(注意,我必须对其进行转义,因此有两个),后跟任意数量的字符,然后是一个文字点(这是文件名的一部分),后跟任何内容,直到 a "(这是我们开始第二个捕获组的地方)。
  • 第二个捕获组记住双引号之后、空格之前直到行尾的所有内容。
  • 然后用记住的第一个捕获组的内容替换,\1 后跟文字反斜杠,后跟记住的第二个捕获组的内容和\2

一旦您确认它可以完成您想要的操作,只需添加即可-i进行替换:

    sed -i 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file

输入:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"

输出:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"

相关内容