我有一個 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"