我需要将表格中的日期字符串转换为一个简单的2016-01-07。我在sed (以及python和awk)中解决了匹配逻辑,并且使用date "Jan 07, 2016 12:12:12 EDT" +%Y-%m-%d命令解决了转换逻辑(sed之外)。
我使用匹配组来捕获月、日和年,这样我就可以在后面的引用中引用它们。我似乎找不到正确的引号组合来获得data命令来识别sed匹配的RHS中的参数,例如:
sed -E "s/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\s[0-9]{1,2}[,].[0-9]{1,4}.?[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}.\w{3})/`date -d "\1\2" "+%Y-%m-%d"`/g" 20170917.csv注意使用任何引号,结果是date忽略第一个参数,并根据第二个参数打印今天的日期。
我已经使用"、'、\"和\'迭代了回溯函数\1和\2,但是似乎一旦它们被后面的代码括起来,就会允许执行date命令,它们就会被忽略。
输入来自报告的csv。
总目tmp/20180121.csv
(1)“插件”、“插件名称”、“家庭”、“严重性”、"IP地址“、”协议“、”端口“、”利用漏洞“、”存储库“、"MAC地址”、"DNS名称“、"NetBIOS名称”、“插件文本”、“首次发现”、“最后观察”、“缓和”、“利用框架”。
(2) "73571“、"Oracle多重漏洞(2014年4月CPU) (Unix)”、"Misc.“、”关键“、"10.140.162.132”、"TCP“、"0”、“是”、“单个扫描”、“00:50:56:c0:00:00:01”、"host.example.com“、”host.example.com“、”插件输出:远程主机上安装了以下易受攻击的Java实例:
路径:/opt/Geneious_linux64 64_7_1_9_with_jre/ 1.7.0_51固定版本: 1.5.0_65 / 1.6.0_75 / 1.7.0_55 / 1.8.0_5",“2018年1月21日22:14:50 EST",”2018年1月21日22:14:50“,”
每一行编号都是一个记录- (1)是标题,(2)代表剩余部分。
要转换的日期字符串位于第2行的最后一行,我只需要这两种情况下的值: 2018-01-21。
发布于 2018-09-07 22:08:52
一种常见的方法是添加一个翻译表并使用反向引用:
echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
s/$/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/
s/^(...) (..), (....).*\1(..).*/\3-\2-\4/'如果您想让sed运行date来转换日期,那么您必须使用GNU:s命令的e标志(以及GNU date Extension-d)。
echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
s/^([[:alpha:]]{3} [[:digit:]]{2}, [[:digit:]]{4}).*$/date -d "\1" +%F/e'尽管这意味着为每一行输入运行一个shell和date,这是非常低效率的(而且也很危险,因为我们让sh解释基于输入动态生成的代码,而我们不知道是否可以信任这些代码)。如果您不想在perl中实现文本处理器,您最好使用一个文本处理器,它可以像sed那样自己完成翻译。
https://unix.stackexchange.com/questions/467617
复制相似问题