带有换行符的 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 输出的主要内容,如果未能解决你的问题,请参考以下文章

将带有硬编码换行符的字符串转换为python中的矩阵

textarea 换行之间的转换

为啥Base64编码有回车换行符

读取csv文件并将df写入带有文本换行的excel

在数据库中存储带有换行符的 TextArea 数据并以相同的格式显示带有换行符

如何在 emacs-term 中禁用自动换行?