sed:如何提取包含冒号的行的一部分

时间:2017-05-06 13:42:05

标签: bash sed

我想用sed:

提取括号内的日期部分
# Equ_time  =  959240309.430000 (26-May-2015 07:38:29)

我使用此代码:

sed -n 's:# Equ_time  =  [0-9]*.[0-9]* .\([0-9]*.[A-Z]*.[0-9]*.[0-9]*.[0-9]*.[0-9]*\).*:\1:p' file.txt

但它返回:

26-May-2015 07

我认为问题与时间段中的冒号字符有关,我该如何更改命令才能正常工作?

3 个答案:

答案 0 :(得分:2)

将其更改为

var data = canvas.fabric.toDataURL();

注意我在最后sed -n 's:# Equ_time = [0-9]*.[0-9]* .\([0-9]*.[A-Z]*.[0-9]*.[0-9]*.[0-9]*.[0-9:]*\).*:\1:p' file.txt 添加了一个冒号。错误是因为您在正则表达式搜索中没有包含冒号

答案 1 :(得分:2)

如果这不是你所需要的全部:

$ awk -F'[ (]' '{print $8}' file
26-May-2015

然后编辑您的问题以澄清您的要求并提供更真实有代表性的样本输入。现在你有一个非常复杂的方法,这绝对是不必要的,因为你可以更简单地用以下方式进行更强大的匹配:

$ sed -n 's:# Equ_time  =  [0-9]*\.[0-9]* .\([^ ]*\).*:\1:p' file
26-May-2015

但这甚至可能都没有必要,如果没有更好的样本输入和相关输出,很难猜出正确的方法是什么。

答案 2 :(得分:0)

考虑输入字符串中的标记部分和模式:

# Equ_time  =  959240309.430000 (26-May-2015 07:38:29)
                                    ^^^

.\([0-9]*.[A-Z]*.[0-9]*.[0-9]*.[0-9]*.[0-9]*\)
          ^^^^^

字符类[A-Z]只匹配大写字母,而不是小写字母。 (在C语言环境中,即:在其他语言环境中,它可能与任何内容匹配。)因此,该部分将仅匹配一次(针对M),ay将与以下几点匹配。由于您没有拼出实际的分隔符(-:),并且使用了[0-9]*而不是[0-9]+,因此模式的其余部分将部分匹配。< / p>

如果你不过分担心匹配确切的格式,我会把你的sed浓缩成这样的东西:

sed -nEe 's/^# Equ_time *=[0-9. ]*\((.*)\).*/\1/p'

或者,如果你想让内部部分与一个角色匹配,那么

([0-9]+-[A-Za-z]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+)

(请注意我在那里使用了扩展的正则表达式)