我有以下格式的文件:
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 :(得分: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