我有一个文件,其中的文本行如下所示:
category1.name1 name2
字符串我希望输出看起来像这样:
category1 name1 name2
型我在Mac上用VS Code编辑这个文件。我很乐意在VS Code中使用正则表达式,或者命令行解决方案。我可以很容易地用制表符替换“.”,但是如果行中没有“.”,如何在行的开头添加制表符?
kzmpq1sx1#
下面是一个使用awk的命令行解决方案:
awk
cat <filename> | awk '{ gsub(/\./, " "); printf "%-15s%s\n", NF == 1 ? " " : $1, $NF }'
字符串您可以根据需要将第一个字段(printf中的%-15s)的宽度调整为更合适的宽度,但除此之外,这似乎可以填充您正在寻找的内容。举例来说:
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 }'
型
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", } },
字符串这使用空格来对齐行,比制表符容易得多。如果绝对需要使用制表符,请告诉我,我会看看是否有什么可以做的改变。
2条答案
按热度按时间kzmpq1sx1#
下面是一个使用
awk
的命令行解决方案:字符串
您可以根据需要将第一个字段(
printf
中的%-15s
)的宽度调整为更合适的宽度,但除此之外,这似乎可以填充您正在寻找的内容。举例来说:
型
如果你的心在使用制表符,你可以使用下面的修改版本,但如果第一个字段比制表符的宽度长(例如,8),事情就不会排队:
型
o8x7eapl2#
这里有另一种方法来做到这一点。我不知道你的数据有多一致,试试这个。
使用我编写的扩展Find and Transform,您可以在键绑定中使用JavaScript来获取所需单词的长度。演示:
的数据
使用此键绑定的:
字符串
这使用空格来对齐行,比制表符容易得多。如果绝对需要使用制表符,请告诉我,我会看看是否有什么可以做的改变。