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"

私はそのような多くの宣言を持っています。

それらを次のようにフォーマットすることは可能ですか(すべて「=」を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"

方法すら思いつきません。どんな種類の助けも大歓迎です。

PS重要な場合は、崇高なテキスト2を使用します.

4

4 に答える 4

2

1 回限りのタスクの場合は、次のことを試してみてください。

「列内のテキスト」機能 (区切り文字: スペース) を使用してテキスト ファイルを Excel などにインポートし、列 A の各行に "public"、列 B "static"、...、列 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

元のレイアウトに注意している場合 (=たとえば、例の 3 行目のデータとは異なり、符号が変数名から分離されるように)、これで問題は解決します。

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 でも非常によく似たことができます。

処理されるデータの量がメガバイトの範囲にある可能性は低く、ましてやそれ以上になる可能性が低いことを考えると、コマンドとコマンドの 2 つのソリューションは完全に合理的です。sedプロセスのコストを測定できる可能性は低いです。

于 2012-10-07T16:44:36.087 に答える
0

問題を解決できる単一の正規表現はありません。あなたの唯一のオプションは、一連の正規表現を実行することです.1つは各行の長さを処理します:

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 に答える