2011-02-09 60 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