【问题标题】:Create 2 columns out of 1 in vim在vim中创建1列中的2列
【发布时间】:2021-05-13 16:23:37
【问题描述】:

我有 2 个很长的串联数组:

["MyHashMap"
"remove"
"put"
"remove"]
[[]
[27]
[65,65]
[19]]

我只是进入可视模式,y第二个数组,然后回到第一行,走到它的末尾,添加空格并点击p。变成:

["MyHashMap"
[[]
[27]
[65,65]
[19]]
"remove"
"put"
"remove"]

我想要的输出是:

["MyHashMap" [[]
"remove"     [27]
"put"        [65,65]
"remove"]    [19]]

我怎样才能做到这一点?

【问题讨论】:

  • 我发现输入和所需输出都令人困惑 - 你确定这就是你想要的吗?并不是说我认为这可以在vim 中轻松完成。
  • 为什么你有 4 个左方括号 [,但有 5 个右方括号 ]
  • @tink 如果你能澄清什么让你特别困惑,我会非常乐意将其清除。也许您可以建议使用 sed 或 awk 的不同方法,我也欢迎。本质上:我有 2 个长输出数组,我将它们都复制了,并用 \n 替换了 ,。这将 2 行转换为 1 个长列。现在,我想将其设为两列输入/输出,以便我可以比较这些值并找到错误所在。为了方便比较,我需要以这种方式排列 2 个以上的数组,但步骤很简单。
  • @tink 关于大括号,我只是复制了不一定对应行的示例数据,因此其中一个大括号丢失了。但在真实数据中,会有正确数量的大括号。

标签: linux shell vim sed


【解决方案1】:

:set virtualedit=all 这样您就可以将光标移动到没有字符的地方(超过行尾)。

将光标移动到第 5 行的第一列并使用CTRL-V 进入可视块模式。选择最后四行的内容。按d 删除选择。

将光标移动到第一行,即您想要第二列的位置。按p 粘贴。

【讨论】:

  • 酷 - 学到了新东西;到目前为止还没有遇到:set virtualedit=all
  • @ProgMetalSlug 相同的结果。唯一的区别是我没有运动边界。删除的列仍会粘贴在第一行之后。
  • @user3081519 确保选择具有可视块模式的文本 (CTRL-V)。这不适用于视觉模式 (v) 或视觉线模式 (V aka SHIFT-V)。
  • 是的,这行得通!我的手指习惯性地拍打着常规的视觉效果。非常感谢!
【解决方案2】:

所以...回到你原来的数据格式(为了完整起见,我添加了一个额外的“行”):

这里是数据:

$ cat yuck
["MyHashMap","remove","put","put"]
["MyMashNap","mover","gut","hut"]
[[],44],[95,30]]

这里是一个 awk 脚本:

$ cat a.f 
BEGIN{
      FS=","
}
{
  for (f = 1; f <= NF; f++) { a[NR, f] = $f } 
}
NF > nf { nf = NF }
END {
  for (f = 1; f <= nf; f++) {
      for (r = 1; r <= NR; r++) {
          printf a[r, f] (r==NR ? RS : OFS)
      }
  }
}

以及如何运行它:

$ awk  -f a.f yuck  | column -t
["MyHashMap"  ["MyMashNap"  [[]
"remove"      "mover"       44]
"put"         "gut"         [95
"put"]        "hut"]        30]]

【讨论】:

  • 出于对工作量的尊重,我会为您的答案投票。谢谢!
  • 嘿-谢谢。当数组数量变大时,只需将其视为一种稍微不那么“手动”的方法。 ;)
【解决方案3】:

使用可视块选择:

如果你在第一行:

4j ............. jump to line five 
Ctrl-v ......... start visual block
3j$ ............ select the end of the paragraph
dgg ............ delete and goes to the first line
A<Space> ....... add an extra space
<Esc>p ......... paste deleted block

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多