regex 如何将文本前置到行

ymzxtsji  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(77)

我有一个文件,其中的文本行如下所示:

category1.name1
name2

字符串
我希望输出看起来像这样:

category1   name1
            name2


我在Mac上用VS Code编辑这个文件。我很乐意在VS Code中使用正则表达式,或者命令行解决方案。我可以很容易地用制表符替换“.”,但是如果行中没有“.”,如何在行的开头添加制表符?

kzmpq1sx

kzmpq1sx1#

下面是一个使用awk的命令行解决方案:

cat <filename> | awk '{ gsub(/\./, " ");  printf "%-15s%s\n", NF == 1 ? " " : $1, $NF }'

字符串
您可以根据需要将第一个字段(printf中的%-15s)的宽度调整为更合适的宽度,但除此之外,这似乎可以填充您正在寻找的内容。
举例来说:

% printf "category1.name1\nname2" | awk '{ gsub(/\./, " ");  printf "%-15s%s\n", NF == 1 ? " " : $1, $NF }'
category1      name1
               name2


如果你的心在使用制表符,你可以使用下面的修改版本,但如果第一个字段比制表符的宽度长(例如,8),事情就不会排队:

cat <filename> | awk '{ gsub(/\./, " ");  printf "%s\t%s\n", NF == 1 ? "\t" : $1, $NF }'

o8x7eapl

o8x7eapl2#

这里有另一种方法来做到这一点。我不知道你的数据有多一致,试试这个。
使用我编写的扩展Find and Transform,您可以在键绑定中使用JavaScript来获取所需单词的长度。演示:


的数据
使用此键绑定的:

{
  "key": "alt+y",
  "command": "findInCurrentFile",
  "args": {
    "find": "(^.+?)\\.(.*)\n(^[^\\.\n]+$)",
    "replace": [
      "$${",
        "const len1 = '$1'.length;",  // group 1 length
        "const space = 4;",           // how many spaces to put inside first line
        "const len3 = '$3'.length;",  // group 3 length

        "return '$1'.padEnd(len1 + space, ' ') + '$2' + `\n` + '$3'.padStart(len3  +len1 + space, ' ');",

        "return str;",
      "}$$",
    ],
    "isRegex": true,
    // "restrictFind": "selections"  // use this if you want to limit to selections
    "postCommands": "cancelSelection",
  }
},

字符串
这使用空格来对齐行,比制表符容易得多。如果绝对需要使用制表符,请告诉我,我会看看是否有什么可以做的改变。

相关问题