使用grep或sed从文件中提取单词

时间:2011-02-09 16:13:33

标签: unix sed grep

我有以下格式的文件:

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命令时,我是新手,我试过但没有运气?我可以用来提取上述信息的任何想法或例子吗?

感谢

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果我理解你的要求,就应该这样做:

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

grep查找包含双管道的行,然后是pdf名称。切割,“切割”基于分隔符的线,并选择第n个字段。

获取所有使用双管道的pdf(不仅仅是在它们之后):

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

编辑:看到评论后我觉得你想要别的东西,所以我调整了答案。把这两个答案看作是一个简单的案例......

答案 2 :(得分:0)

这只会在“||”之后提取立即的文件名序列

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

编辑:我删除了$ {...}以使其更具可读性。

答案 3 :(得分:0)

为什么不通过sed简单地发送您的输入?像这样:

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

答案 4 :(得分: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