助けてください。成功したローカルオペレーション 次の変換はawkの助けを借りて実装されました。 今地域(GNU Awk 4.0.2バージョンのLinux Cent OS)は完全に機能しますが、問題はリモートバージョンにあります。
答え1
不要なものをsed
使用してこれを行うことができますGNU awk
。しかし。sp.config.fal.proxyhost
LiferayKeyStore.jks
awk
したがって、aを変換する必要がある行のルールと最初の${ ... }
キー名のみを変換する必要がある場合のルールの2つのルールで構成されるプログラムを提案します(実際には3つのルールです。最初のルール)ケースを検索する場合、ステートメントのみが見つかったすべてのケース${ ... }
の次の項目、空白行を含む「その他すべての」ケースの項目)key=value
入力テキストがというファイルにあると仮定すると、config.cfg
次のようになります。
awk '/\$\{[[:print:]]*\}/ {match($0,"([[:print:]]+)=\\${([[:print:]]+)}([[:print:]]*)",a); gsub("\\.","_",a[1]); gsub("\\.","_",a[2]); print toupper(a[1])": (("toupper(a[2])"))"a[3]; next}; /[[:print:]]+=[[:print:]]+/ {match($0,"([[:print:]]+)=([[:print:]]+)",a); gsub("\\.","_",a[1]); print toupper(a[1])": "a[2]; next}; {print}' config.cfg
これにより、次のことが行われます。
パターンを含むすべての行に印刷可能文字数を制限なしに
${...}
使用して、match()
パターン「最大1つ」、=
囲む文字列を含むパターン、およびその後の印刷可能文字数をローカライズします。${ ... }
かっこで囲まれた部分はすべて「サブ式」と表示され、その部分は実際内容は最初のサブ式などa
で配列に保存されます。次に、部分をa[1]
取り、すべてのピリオドを下線で置き換えます。 2番目のサブ式に含まれる文字列に対しても同じことを行います。出力に置き換えられたaの大文字変換バージョンを印刷します(ただし、今回は含む)。最後に、「残りの行」である未変換バージョンを印刷します。gsub
a[1]
key
${...}
a[2]
a[1]
:
a[2]
(( ... ))
a[3]
非常に重要:このnext
ディレクティブを使用してその行の追加処理をスキップし、次の行から再開します。それ以外の場合は、別の変換で2回処理(および出力)できます。私たちが偶然見つからなかった場合、
${ ... }
この行はする「key = value」ステートメント(/[[:print:]]+=[[:print:]]+/
つまり、ゼロ以外の印刷可能文字=
の後にゼロ以外の印刷可能文字が続く)を含み、「キー」部分にのみ置換と変換を適用します。同様に、ルールが一致した場合は追加処理をスキップします。最後に、上記のルールのいずれも満たしていない場合は、「現状のまま」行を印刷してください。
編集する
NULL値がある場合、つまりkey=
その値をキャプチャするために他のルールも追加する必要があります。
awk '/\$\{[[:print:]]*\}/ {match($0,"([[:print:]]+)=\\${([[:print:]]+)}([[:print:]]*)",a); gsub("\\.","_",a[1]); gsub("\\.","_",a[2]); print toupper(a[1])": (("toupper(a[2])"))"a[3]; next}; /[[:print:]]+=[[:print:]]+/ {match($0,"([[:print:]]+)=([[:print:]]+)",a); gsub("\\.","_",a[1]); print toupper(a[1])": "a[2]; next}; /[[:print:]]+=[[:space:]]*/ {match($0,"([[:print:]]+)=([[:space:]]*)",a); gsub("\\.","_",a[1]); print toupper(a[1])":"; next}; {print}' config.cfg
key=value
Base64変換によってaで終わるペアがあるため、3番目のルールを2番目のルールに吸収することは不可能です。=