我有多个看起来像这样的文件:
//file start
$thing1 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2013-10-01'};
$thing2 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2012-11-01'};
$thing3 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2014-12-01'};
//file end
使用Unix,获取文件中所有日期项目的最佳方法是什么。我知道我在文件中查找的项目看起来像
{somethingDate = '1111-11-11'}
从此我想抓住'1111-11'11'。文件一将有多个'fileOneDate'条目,文件二将有多个'fileTwoDate'条目等。我的目标是采取所有这些日期'* Date',删除重复项,并将它们排序到输出文件,使用sort命令和管道很容易。但是,我坚持第一部分。到目前为止我看到的是这样的:
<command I'm working on now that grabs dates> | sort -n > outputfile.txt
我相信要走的路是AWK脚本。解析这些文件的正确方法是什么?
答案 0 :(得分:1)
你需要这样吗?
sed -n "s/.*'\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)'.*/\1/p"
如果-r
中有sed
选项,
sed -nr "s/.*'([0-9]{4}-[0-9]{2}-[0-9]{2})'.*/\1/p"
<强>测试强>
sat:~# echo "{somethingDate = '1111-11-11'}" | sed -n "s/.*'\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)'.*/\1/p"
1111-11-11
sat:~#
sat:~# echo "$thing1 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2013-10-01'};" | sed -n "s/.*'\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)'.*/\1/p"
2013-10-01
答案 1 :(得分:1)
grep -o
是提取文字的最简单方法
sort -u
排序(duh)并删除重复项。
grep -oE '\<[0-9]{4}-[0-9]{2}-[0-9]{2}\>' <<'END' | sort -u
$thing1 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2013-10-01'};
$thing2 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2012-11-01'};
$thing3 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2014-12-01'};
$thing2b= {'item1' => '0', 'item2 => '3', 'itemDate' => '2012-11-01'};
$thing2c= {'item1' => '0', 'item2 => '3', 'itemDate' => 'foo2012-01-01bar'};
END
2012-11-01
2013-10-01
2014-12-01
答案 2 :(得分:0)
如果您的示例文件名为datefile
,则:
$ sed -nr "s/.*Date' => '([^']+)'.*/\1/p" datefile | sort -n
2012-11-01
2013-10-01
2014-12-01
上面的正则表达式查找包含Date' => 'datestring'
的行并打印日期字符串。
更详细地说,sed
命令包含一个替换,它以sed
- 样式写成s/old/new/options
。 old
部分有点复杂,所以我将逐一介绍它:old
正则表达式查找(a).*
表示任何内容(任意数量的任何字符),后跟(b)Date' => '
,其次是(c)([^']+)
,这意味着一个或多个不是单引号的字符,后跟(d)单引号,然后是(e).*
,意思是什么。如果匹配,那么该行将替换为日期字符串(保存为\1
,因为日期字符串正则表达式是parens)然后,由于表达式末尾的p
,该日期已打印。由于-n
选项被赋予sed
,因此不会打印没有匹配日期字符串的行。
如果您的sed
不支持-r
(OSX),那么请使用类似的表达式,但添加一些反斜杠:
sed -n "s/.*Date' => '\([^']\+\)'.*/\1/p" datefile | sort -n