2012-05-02 31 views
3

我不是程序員,但我一直在試圖做一些perl正則表達式,並且撞牆了。我試圖做一些日誌文件的數據分析,我遇到了以下問題:刪除文本 - 想法任何人?

我有一個文件,test.csv,它是由多個從生產佈局如下格式的另一個程序單行條目:

  • d:\雪\ DIR.TXT
  • d:\雪\歷史\ dir.tff
  • d:\雪\歷史\ help.jar
  • d:\ winter \ show \ help.txt
  • d:\夏\海邊\海洋\ swimming.txt

我想會做的是刪除路徑列表中的文件名,所以 生成的文件將包含:

  • d:\雪\
  • d:\雪\歷史\
  • d:\雪\歷史\
  • d:\冬季\顯示\
  • d:\夏\海邊\海洋\

我已經在我的頭上撞上了牆,並嘗試過各種perl正則表達式,試圖放棄文件名而沒有多少運氣。由於到目錄的路徑長度不一,所以我打了一堵牆,我不確定這是否可以在perl或python中完成。

如何

回答

4

你可以在Perl這麼做只有一個行的任何想法:

perl -pe 's/[^\\]+$/\n/' <infile.txt >outfile.txt 

在片以這樣的:

-p導致的Perl來包裝聲明(與-e提供)在while循環中,將語句應用於輸入文件的每一行,並打印結果。

-e給Perl一個針對每一行運行的語句。

s/[^\\]+$/\n/是一個替換語句,它使用正則表達式將行的末尾不包括反斜槓的任何字符序列更改爲只包含換行符\n

[^\\]是一個正則表達式匹配任何單個字符不能反斜槓

[^\\]+是一個正則表達式的一個或多個字符不在反斜槓

[^\\]+$是一個相匹配正則表達式匹配一個或多個字符不是反斜線後跟行尾

0

你可以用這一個班輪做也

perl -pe s /\\\\\w+\.\w+$// test.csv > Output.txt 

\w+\.\w+$與它在路徑

3

使用正則表達式可能工作結束擴展名,而是使用爲此目的設計的模塊匹配通常來說是一個更好的主意。 File::BasenameFile::Spec用於此目的的核心模塊:

代碼:

use strict; 
use warnings; 
use v5.10; 

use File::Basename; 

say dirname($_) for <DATA>; 

__DATA__ 
d:\snow\dir.txt 
d:\snow\history\dir.tff 
d:\snow\history\help.jar 
d:\winter\show\help.txt 
d:\summer\beach\ocean\swimming.txt 

輸出:

d:\snow 
d:\snow\history 
d:\snow\history 
d:\winter\show 
d:\summer\beach\ocean 

當然,如果你想結束反斜線,你必須添加它們。

而對於File::Spec

my ($volume, $dir, $file) = File::Spec->splitpath($path); 
my $wanted_path = $volume . $dir; # what you want 

這兩個模塊已經很長一段時間的核心分佈,這是一個很好的好處的一部分。

0

這裏是做在Python中的一種方式:

python -c 'import sys,re;[sys.stdout.write(re.sub("[^\\\]+$","\n",l))for l in sys.stdin]' <in.txt> out.txt 

我承認這是不是一個Perl的解決方案更詳細一點。