首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将参数传递给sed的LHS中的date命令

将参数传递给sed的LHS中的date命令
EN

Unix & Linux用户
提问于 2018-09-07 20:16:15
回答 1查看 315关注 0票数 1

我需要将表格中的日期字符串转换为一个简单的2016-01-07。我在sed (以及python和awk)中解决了匹配逻辑,并且使用date "Jan 07, 2016 12:12:12 EDT" +%Y-%m-%d命令解决了转换逻辑(sed之外)。

我使用匹配组来捕获月、日和年,这样我就可以在后面的引用中引用它们。我似乎找不到正确的引号组合来获得data命令来识别sed匹配的RHS中的参数,例如:

代码语言:javascript
复制
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。

EN

回答 1

Unix & Linux用户

发布于 2018-09-07 22:08:52

一种常见的方法是添加一个翻译表并使用反向引用:

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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那样自己完成翻译。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/467617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档