所以我在我的文件中以这种方式定义了变量:
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"
我甚至想不出办法。任何形式的帮助表示赞赏。
P.S如果重要,我使用崇高的文字2。
答案 0 :(得分: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的名称会有所不同。
答案 1 :(得分:1)
如果您对原始布局要小心(例如,=
符号与变量名称分开,例如,与示例中的第三行数据不同),那么这将完成工作:< / p>
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]); }'
它假设您正在处理'public static final String'(但不验证)。它跟踪它读取的最长名称的长度(第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
流程的费用。
答案 2 :(得分:0)
没有单一的正则表达式可以解决您的问题。您唯一的选择是运行一系列正则表达式,一个用于处理每个行长度:
s/^(.{40})=/\1 =/
s/^(.{39})=/\1 =/
s/^(.{38})=/\1 =/
即便如此,这可能不是你想要的,而且可能更容易手工制作。
问题在于,正则表达式替换在不同时间插入不同字符串的唯一方法是,它插入的是backref,并且没有backref为您提供5 - N
空格字符。你的另一个选择是尝试捕获一个可变数量的字符,但在这种情况下,你也无法做到这一点。
正则表达不是为了做那样的事情(他们不支持算术),而是一些文本编辑器,所以只需找一个花哨的文本编辑器或手工完成。
答案 3 :(得分:0)
由于您使用的是Sublime Text 2,因此有一种更简单的方法 Sublime Text 2有一个很棒的软件包,可以完全你想要的东西:
的 Sublime Alignment 强>
多线选择的简单对齐和 Sublime Text 2的多个选择。
功能强>
- 通过插入空格(或。)将多个选择对齐到同一列 标签)
- 将多行选择中的所有行对齐到相同的缩进 等级
- 将多行选择的每一行上的第一个=对齐 同栏
在:
后: