2011-02-09 62 views
0

我有如下格式的文件:從提取文件用grep字或sed的

File     : \\dvtbbnkapp115\nautilus\030db28a-f241-4054-a0e3-9bfa7e002535.dip was 
processed. 
Entries Found   : 0 
Unarchived Documents : 1 
      File Size : 1 K 

Error : The following line could not be processed. Bad Document Type. 

Error : Marketing and Contact preference change 
     update||7000003735||078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.pdf 



File     : \\dvtbbnkapp115\nautilus\078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.dip was 
processed. 
Entries Found   : 0 
Unarchived Documents : 1 
      File Size : 1 K 

Error : The following line could not be processed. Bad Document Type. 

Error : Declined - Bureau Data (process)||7000003723|252204|2f1d71f4-052c-49f1-95cf-9ca9b4268f0c.pdf 



File     : \\dvtbbnkapp115\nautilus\2f1d71f4-052c-49f1-95cf-9ca9b4268f0c.dip was 
processed. 
Entries Found   : 0 
Unarchived Documents : 1 
      File Size : 1 K 

Error : The following line could not be processed. Bad Document Type. 

Error : Unable to call - please 
     contact|40640510016710|7000003180||3e6a792f-c136-4a4b-a654-37f4476ccef8.pdf 

我所需要的雙管後,只提取PDF文件的名稱,並將其寫入到文件中。當談到unix/sed/grep命令時,我是一個新手,我嘗試過但沒有運氣?任何想法或例子我可以用來提取上述信息?

感謝

+0

我看到列出了三個PDF文件。你想要所有三個人還是隻有兩個人的名字緊跟在||之後? – chrisaycock 2011-02-09 16:20:34

+0

嗨,在這個例子中只有3個,但可能有100個像上面那樣。謝謝 – Marco 2011-02-09 16:58:10

回答

0

如果我理解正確你的要求,這應該這樣做:

grep -o -E "\|\|[^\|]*.pdf" < input | cut -f 3 -d "|" 

的grep查找包含雙管子,接着PDF名稱的線條。剪切,根據分隔符「剪切」該行,並選擇第n個字段。

若要取得與雙管的管線(不只是在他們以後)所有PDF:

grep "||" < input | cut -f 5 -d "|" > output 

編輯:看到評論後,我想你想別的東西,所以我調整了答案。把這兩個答案,因爲它似乎是簡單的情況下...

0

這將只提取文件名來立即'||'序列。

grep -o '||[^|]*\.pdf' YOUR_FILE | tr -d '|' 

編輯:我刪除了$ {...},使其更具可讀性。

0

爲什麼不簡單地通過sed發送您的輸入?就像這樣:

sed -n -e '/\|\|.*pdf$/ { s/.*\|\|//; p; }' 
1

試試這個,如果你只想PDF文件名,如果他們遵循雙管字符和上線的最後一件事:

sed -n 's/.*||\([^|]*.pdf\)$/\1/p' inputfile 

在你的例子第二PDF文件名如下一個單獨的管道字符,但是該行上有一組較早的雙管道。這應該適應這兩種風格的行如果文件名是不包括任何管道符部分:

sed -n 's/.*||.*|\([^|]*.pdf\)$/\1/p' inputfile 

如果你的文件名由上只有十六進制數字和連字符,你可以多一點選擇的是這樣的:

sed -n 's/.*||.*|\([[:xdigit:]-]*.pdf\)$/\1/p' inputfile 
0

紅寶石(1.9+)

$ ruby -F'\|\|' -ane 'print $F[-1] if $_["\.pdf"] && !$F[1].include?("|") ' file 
078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.pdf 
3e6a792f-c136-4a4b-a654-37f4476ccef8.pdf