次のような内容を含む多くの行を含む 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
動作方法は次のとおりです。
- 上記の間のものは
\(
とを使用していたことを覚えています\)
(これらはキャプチャ グループです)。 - したがって、最初のキャプチャ グループは
\\.*\..*
、文字どおりのバックスラッシュ (エスケープする必要があったため、2 つあることに注意してください) に続いて任意の数の文字、文字どおりのドット (これはファイル名の一部です)、そして a までの任意の文字 (ここから"
2 番目のキャプチャ グループが始まります) にヒットするまで、できる限り多くの情報を記憶します。 - 2 番目のキャプチャ グループは、スペースの前の二重引用符から行末までのすべてを記憶します。
- 次に、最初のキャプチャ グループの記憶された内容
\1
、リテラルのバックスラッシュ、2 番目のキャプチャ グループの記憶された内容の順に置き換えます\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"