1

所以我在我的文件中以这种方式定义了变量:

public static final String hello_world = "hello world" 
public static final String awesome_world = "awesome world"
public static final String bye_world= "bye world"

我有很多这样的声明。

是否可以将它们格式化为(一行中的所有'='):

public static final String hello_world   = "hello world" 
public static final String awesome_world = "awesome world"
public static final String bye_world     = "bye world"

我什至想不出办法。任何形式的帮助表示赞赏。

PS如果重要的话,我使用崇高的文字2。

4

4 回答 4

2

如果这是一次性任务,您可以尝试以下操作:

使用“列中的文本”功能(分隔符:空格)将文本文件导入到 Excel 中,以便 A 列在每行中包含“public”,B 列“静态”,...,E 列包含变量名称,F 列是“=”符号,G 列是变量值(字符串)。

然后将以下公式放入单元格 H1(并将其复制到其他行):

="public static final String "&E1&REPT(" ";50-LEN(E1))&" = "&""""&G1&""""

之后,H 列包含以下输出:

public static final String hello_world                                        = "hello world"
public static final String awesome_world                                      = "awesome world"
public static final String bye_world                                          = "bye world"

请注意,如果您的 Excel 语言不是英语,则 Excel 函数 REPT 和 LEN 的名称会有所不同。

于 2012-10-07T15:32:25.853 回答
1

如果您对原始布局很小心(例如,将=符号与变量名分开,这与示例中的第三行数据不同),那么这将完成这项工作:

awk '{ if (length($5) > max) max = length($5);
       name[NR] = $5; value[NR] = $0; sub(/^[^"]*"/,  "\"", value[NR]); }
 END { format = sprintf("public static final String %%-%ds = %%s\n", max);
       for (i = 1; i <= NR; i++) printf(format, name[i], value[i]); }'

它假定您自始至终都在处理“公共静态最终字符串”(但不验证)。它跟踪它读取的最长名称的长度(第 1 行),以及从打开的双引号到行尾的变量名称和材料(第 2 行)。最后,它会生成一个格式字符串,该字符串将打印在字段中左对齐的变量名称,只要最长(第 3 行)。然后将其应用于保存的数据(第 4 行),生成:

public static final String hello_world   = "hello world" 
public static final String awesome_world = "awesome world"
public static final String bye_world     = "bye world"

要使其防弹(例如原始数据),您必须更加努力地工作,尽管它不应该是不可克服的。对于草率的原始格式,最简单的修复方法是使用以下方法预过滤数据:

sed 's/=/ = /'

适当间隔的输入周围的额外空格不会影响输出,并且 3 样本数据行中的缺失空格是固定的。在内部这样做会很繁琐,awk因为您希望它在编辑后重新拆分行。你可以在 Perl 中做一些非常相似的事情。

鉴于要处理的数据量不可能在兆字节范围内,更不用说更大了,两个命令-命令的解决方案是完全合理的;您不太可能衡量sed流程的成本。

于 2012-10-07T16:44:36.087 回答
0

没有单一的正则表达式可以解决您的问题。您唯一的选择是运行一系列正则表达式,一个来处理每个行的长度:

s/^(.{40})=/\1 =/
s/^(.{39})=/\1  =/
s/^(.{38})=/\1   =/

即便如此,这可能不是您想要的,而且手动完成可能要容易得多。

问题是,正则表达式替换可以在不同时间插入不同字符串的唯一方法是,如果它插入的是反向引用,并且没有反向引用可以为您提供5 - N空格字符。您的另一种选择是尝试捕获可变数量的字符,但在这种情况下,也无法为您做到这一点。

正则表达式不是用来做这样的事情(它们不支持算术),但一些文本编辑器是,所以只需找一个花哨的文本编辑器或手工完成。

于 2012-10-07T15:36:13.897 回答
0

由于您使用的是 Sublime Text 2,因此有一种更简单的方法可以做到这一点。
Sublime Text 2 有一个很棒的包,它可以完全满足您的要求:

崇高对齐

Sublime Text 2 的多行选择和多个选择的简单对齐。

特征:

  • 通过插入空格(或制表符)将多个选择对齐到同一列
  • 将多行选择中的所有行对齐到相同的缩进级别
  • 将多行选择的每一行上的第一个 = 对齐到同一列

前:

在此处输入图像描述

后:

在此处输入图像描述

于 2012-10-07T16:46:54.317 回答