元のレイアウトに注意している場合 (=
たとえば、例の 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
プロセスのコストを測定できる可能性は低いです。