テキストファイル内の乱雑なパスからファイル名を削除する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

動作方法は次のとおりです。

  • 上記の間のものは\(とを使用していたことを覚えています\)(これらはキャプチャ グループです)。
  • したがって、最初のキャプチャ グループは \\.*\..*、文字どおりのバックスラッシュ (エスケープする必要があったため、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"

関連情報