從文字檔 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"

相關內容