【问题标题】:Insert space in a string at 8th column using sed使用 sed 在第 8 列的字符串中插入空格
【发布时间】:2014-08-22 02:48:46
【问题描述】:

需要在第 8 列插入一个空格来分隔日期和时间。

输入文件:

AAA|detail_hist|count|||766855||2014-08-2019:49:57
BBB|detail_hist|count|||766855||2014-07-2019:49:57

需要的输出:

AAA|detail_hist|count|||766855||2014-08-20 19:49:57
BBB|detail_hist|count|||766855||2014-07-20 19:49:57

【问题讨论】:

    标签: unix sed


    【解决方案1】:

    你可以用这个:

    $ sed -r 's/[0-9]{4}-[0-9]{2}-[0-9]{2}/& /' file
    AAA|detail_hist|count|||766855||2014-08-20 19:49:57
    BBB|detail_hist|count|||766855||2014-07-20 19:49:57
    

    它查找XXXX-YY-ZZ 的块并将其替换为XXXX-YY-ZZ(即块+空格)。

    如果不支持-r,则需要对每个{}进行转义:

    sed 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/& /' file
    

    【讨论】:

    • 不客气。我希望你能从答案中学到一些东西。
    【解决方案2】:

    我知道您要求使用 sed 解决方案,但是当您谈论修改特定字段编号时,您应该真正考虑 awk,因为它内置了对编号字段的支持:

    $ awk 'BEGIN{FS=OFS="|"} {sub(/.{10}/,"& ",$8)} 1' file
    AAA|detail_hist|count|||766855||2014-08-20 19:49:57
    BBB|detail_hist|count|||766855||2014-07-20 19:49:57
    

    【讨论】:

    • 虽然这可以在我的 BSD 和 GNU awk v4 上立即运行,但我必须在 GNU awk v3.* 上启用 --re-interval。我一直想知道,如果awk 默认使用 ERE,为什么还需要这个额外的选项?
    • 因为 RE 间隔不是 ERE 语法的原始部分,所以 gawk 最初决定使 {10} 字面意思是字符 { 然后 10 然后 } 以实现向后兼容性。他们在 gawk 4 中更改了该决定,因此默认情况下启用 RE 间隔。
    • 感谢@EdMorton。现在说得通了。
    【解决方案3】:

    通过 sed,

    $ sed 's/^\(.*\)\([0-9][0-9]:.*:.*\)$/\1 \2/g' file
    AAA|detail_hist|count|||766855||2014-08-20 19:49:57
    BBB|detail_hist|count|||766855||2014-07-20 19:49:57
    

    【讨论】:

    • 稍微简单一点:sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})$/ \1/' file -- "g" 标志不是必需的,因为正则表达式是锚定的,因此每行只能匹配一次。
    【解决方案4】:

    如果结构与示例中的一样(第 8 列没有)

    sed 's/.\{8\}$/ &/' YourFile
    

    空间安全

    sed 's/.\{8\} *$/ &/' YourFile
    

    --posix 与 gnu sed

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2015-07-06
      相关资源
      最近更新 更多