【问题标题】:vi keep only first 10 characters of a columnvi 只保留一列的前 10 个字符
【发布时间】:2016-02-18 13:14:46
【问题描述】:

如何在 vi 中做到这一点?

awk -F"," awk '{print substr($1,1,10)}'

我只想保留我的日期列的前 10 个字符(例如 2014-01-01)而不包括时间戳。

我尝试在 awk 中执行此操作,但出现此错误:

sed: RE error: illegal byte sequence

我认为这是 bash_profile 设置错误。

这是我的 bash_profile 中的内容:

#export LANG=en_US.UTF-8
#export LOCALE=UTF-8

export LC_CTYPE=C
export LANG=C

【问题讨论】:

  • awk 产生错误消息sed: RE error: illegal byte sequence 的可能性极小。清理您的问题以准确并显示示例输入和预期输出。为什么还要在vi 中这样做?
  • 如果您的语言环境有问题,可以尝试LC_ALL=C awk '{print substr($0,1,10)}' file >output

标签: vim awk sed


【解决方案1】:

在 vim 中,执行:

:%norm! 11|D

这将影响缓冲区中的所有行。

如果您愿意,:s 也可以完成这项工作。

【讨论】:

  • 你在哪里指定列?
  • @jxn 在上面的命令中有一个神奇的数字11。这可能意味着什么?
  • 也许在给定的上下文中10l11|更容易
  • 这太有用了......我不敢相信我没有用过那么多只是因为我忘记了这个:-o
  • @BenSchwehn ! 忽略映射。它清楚地写在doc中。阅读:h :norm
【解决方案2】:
:%s/.\{,10}\zs.*//

  • :%s/:将替换应用于所有行
  • .\{,10}: 匹配任何东西最多 10 次(贪心)
  • \zs:表示比赛开始
  • .*:匹配该行的其余部分
  • /:s第一部分结束
  • /s第二部分结束(由于两者/之间没有任何内容,替换为nothing,即删除)

【讨论】:

    【解决方案3】:

    对于编辑文本块,可以通过CTRL-V 访问-- VISUAL BLOCK -- 模式(在Windows 上通常为CTRL-Q)。然后您可以按 d 删除您的选择。

    或者用一个简单的替代命令

    :%s/\%>10c.*//
    
    • \%>10c - 在第十列之后匹配
    • . - 匹配任何单个字符,但不匹配行尾
    • * - 匹配 0 个或多个前面的原子,尽可能多

    或者你可以使用范围

    :1,3s/\%>10c.*//
    

    这将替代前三行。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2019-12-16
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2021-12-18
      相关资源
      最近更新 更多