特定の条件に基づいてファイルからスペースを削除します。

特定の条件に基づいてファイルからスペースを削除します。

いくつかのファイルを整理し、書き方の一貫性を高めたいと思います。

したがって、私の入力は次のようになります。

$a$h$l)r
^9 ^5リットル
\ウルド

問題は、いくつかのスペースが「不要」であり、ファイルの比較が難しくなることです。したがって、次のいずれかの文字の直後にない限り、すべてのスペースを削除したいと思います。

$
^
@
!
/
(
)

たとえば、$<space>空白を保持する必要があります。

または、スペースが次のいずれかの文字の後の2番目の文字の場合:

i 
o 
s
=
%

たとえば、iA<space>スペースは保存されます。では、iC<space><space>最初のスペースのみを保存できます。

そして別のキャラクターがありますが、

s

<space>最初または2番目の文字にすることができます。

しかし、追加の困難があります。これらすべての場合、記号または文字はコマンドです。それに続く文字は変数です。コマンド$の場合も同様です$$。の場合、最初のドル記号はコマンド、2番目は変数です。したがって、この場合、$$<space>$ - の後にあっても、後の $ は前の $ の変数なので、スペースを削除する必要があります。これは、最初のリストのすべての「コマンド」に対応します。コマンドの後には常に変数が続きます。したがって、例えば、^$<space>同様に適用されます。この場合、$は^の変数なので、スペースを削除する必要があります。

2番目のリストの項目とs2番目のリストの項目の後には、常に2つの変数が続きます。たとえば、2番目のsが変数であるため、ss<space><space>そうする必要があります。ss<space>

この問題は最初のリストの文字でのみ発生し、2番目のリストのコマンドはコマンドとして機能する文字のs直後にはないために発生します。

これに加えて、リストされていない他のコマンドがあります。しかし、後ろに空白があることができないので関係ありません。スペース自体がコマンドを構成するわけでもありません。

混乱する可能性があることはわかりますが、答えがあれば喜んで説明します。

したがって、入力の例は次のようになります。

:
$$$N
$$$a
$$$^$私は
SLRカメラ
*56 長さ
酸素1酸素2
%A%$ v

希望の出力は次のとおりです。

:
$$$N
$$$a
$$$^$i
もっと新しく
*56リットル
酸素1酸素2
%A%$ v

私はGNU / Linuxオペレーティングシステムを使用しています。

答え1

より良いと思います。最初のバリエーション:

perl -pe 's{([\$^\@!/()].|[ios=%]..)| }{$1}g'

GNU sedと同じ:

sed -E 's#([$^@!/()].|[ios=%]..)| #\1#g'

または携帯用変形:

sed 's#\(\([$^@!/()].\)*\([ios=%]..\)*\) *#\1#g'

関連情報