【发布时间】:2013-06-29 20:55:23
【问题描述】:
我正在记录的服务器之间进行文件传输。这些最终必须上传到数据库,所以我正在对它们进行预处理以检查错误。每个日志文件条目代表一次传输,格式如下:
key1=value1 key2=value2
总共 16 个字段。大多数传输都很好,除非有人传输名称中带有空格的文件。这弄乱了我的处理,因为我只是在我的 perl 脚本中调用空间分割。示例:
DATE=20130411140806.384553 HOST=somehost PROG=someserver NL.EVNT=FTP_INFO START=20130411140806.384109 USER=someuser FILE=/extended_path/Wallpapers Folder.ico BUFFER=98720 BLOCK=262144 NBYTES=0 VOLUME=/ STREAMS=2 STRIPES=1 DEST=[0.0.0.0] TYPE=STOR CODE=226
这只是“Wallpapers”和“Folder.ico”之间有空格的一个示例。有没有办法设计一个正则表达式来解决这个问题并拆分所有这些键值对?如果没有正则表达式的方法可以做到这一点,你能建议我用其他方法来处理它吗?
我的目标是用任何内容(即删除空格)或下划线替换这些空格,这样当我运行脚本以加载到数据库中时,只需拆分单个空格就不会出现问题。顺便说一下,我正在使用 perl 来完成所有这些工作。
【问题讨论】:
-
你能一直指望这些字段按那个顺序排列吗?
-
我建议将值添加为带引号的字符串,可以是所有值,也可以至少是包含空格的值。
-
@DanielGimenez 是的。它由服务器记录。
-
您的文件格式很垃圾。考虑文件名
NOT A HEADER=.pwned,这在许多文件系统上都是合法的。明智的做法是更改生成这些日志的程序以正确转义其输出(例如转义反斜杠、空格和=),或将复杂的 args 括在引号中(转义反斜杠和引号)。然后s/\\(.)/$1/g可以恢复这种转义。内容可以例如匹配/(?:\\.|\S)*/ -
@amon 感谢您的意见,但不幸的是,更改日志记录过程超出了我的控制范围。我只需要处理它吐出的东西。