带有换行符的 grep 输出
Posted
技术标签:
【中文标题】带有换行符的 grep 输出【英文标题】:Ouput of grep with new line 【发布时间】:2012-11-22 15:13:19 【问题描述】:我正在编写一个脚本,该脚本解析打开的 xml 文档中的信息并解析脚本的输出以提供 csv 输出。
我被困在最后一个障碍上。
find /media/path/to/files -type f -iname '*.xlsx' -exec perl parseXML.py \; \
| grep -v 'Document\ name\|creator\|lastModified\|Printed\|created\|modified' \
| tr '\n' '.'; echo \n \
>> list.csv
这个输出的问题是我最终得到了一个包含所有文档的庞大列表,并且在 python 或 perl 中对其进行排序出现在我的知识水平之上。
我希望有一种方法可以通过使用 sed 来避免从偏移量中发生这种情况
(find /media/E01880-0-CH5-W001/Working/E01880-4-CH5-E001/ED/ -type f -iname '*.xlsx' -exec perl parseXML.py \; | grep 'Document\ name\|creator\|lastModified\|Printed\|created\|modified' | tr '\n' '.'; echo \)n >> list.csv
可惜没有用,这只是删除了包含修改信息的行。
今天晚上我终于尝试使用 sed 和一些正则表达式来更改输出
cat PleaseWork.csv | sed -i 's/modified[^"\r\n]*\./&\\n/g' >> NewFile.csv
理论上语法应该替换已修改和任何字符,直到匹配表达式和新行的句点,但我收到一个 sed 错误,没有输入文件,我想我现在已经盯着屏幕看够了。
请帮忙。
我正在使用来自 google 的 snortdlp 代码:
http://snortdlp.googlecode.com/svn-history/r115/trunk/src/python/read_open_xml.pl
【问题讨论】:
猫 PleaseWork.csv | sed 's/modified[^"\r\n]*\./&\n/g' >> NewFile.csv 执行 perl parseXML .py?那是一个带有 python 扩展的 perl 脚本吗? @TLP 只要 parseXML.py 有一个 shebang 行,它就可以正常工作。 :-( 回复:“我收到一个 sed 错误,没有输入文件”:那是因为您使用了-i
标志,它告诉(某些版本的)sed
您希望它修改现有文件.例如,sed -i s/a/b/g foo.txt
实际上会用其自身的修改版本覆盖文件foo.txt
,并将所有a
-s 替换为b
-s。在您的情况下,您不希望sed
这样做;您想在标准输入上传递文本,并在标准输出上输出结果。因此,您可以删除 -i
标志。
@TLP 见perldoc.perl.org/perlrun.html(搜索“奇异”)。
【参考方案1】:
如果我正确解释了您的问题,您将尝试为匹配“文档名称”、“创建者”等的所有文件输出整行(但不是换行符),并打印整行(以及换行符) ) 用于匹配“修改”的行。只需跳过 grep 并使用 awk 代替:
awk '/Document name|creator/printf "%s.", $0 /modified/'
(为了清楚起见,我缩短了匹配项——根据需要添加其他标签。)
【讨论】:
如果输入中包含任意数量的printf
格式字符,printf
将会非常混乱。这样会更好:printf "%s.", $0
以上是关于带有换行符的 grep 输出的主要内容,如果未能解决你的问题,请参考以下文章