指定されたパターンに従わない場合は、文字を削除します。

指定されたパターンに従わない場合は、文字を削除します。

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

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

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

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

  • $
  • ^
  • 時間
  • iN(Nは変数で、すべての文字の長さは1バイトです。)
  • oN(Nは上記のように変数です)
  • S
  • sN(Nは上記のように変数です。)
  • @
  • /
  • )
  • =N(Nは上記のように変数です)
  • %N(Nは上記のように変数です。)

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

:
$$$N
$$$a
SLRカメラ
*56 長さ
酸素1酸素2
%%xv

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

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

この%%x v場合、スペースは最初の文字の後の3番目の文字であるため削除されます。%ここで、2番目の文字は%変数として使用されます。

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

答え1

今知っていると思います -ありがとう

追加文字を処理するために拡張正規表現を使用するオプション窒素簡単に(ここで使用される入力例は、質問に入力したものとは若干異なります。):

sed -Ee's|([sio=%]..)?([@!T()^$/].)? *|\1\2|g' \
<<""
:
$ $ $N
$  $  $a
sa  s    l r
*56 l r
o1 o 2
%%xv

:
$ $ $N
$ $ $a
sa s  lr
*56lr
o1 o 2
%%xv

sedこれを使用するにはGNU / BSD / ASTが必要です。同等のBREは次のとおりです。

sed 's|\([soi=%]..\)\{0,1\}\([@!T()^$/].\)\{0,1\} *|\1\2|g'

秘訣は、すべての一致を最終的にオプションにし、パターンのどの部分も優先しないようにすることです。実際にはデータを挿入するのではなく削除するものなので(これは別の方法で処理する必要があります)一致するターゲット間の切り替え中に空の文字列一致の問題は発生しません。どのくらいの空の文字列が削除されるのか誰が気になりますか?

sed正規表現は、パターン空間を左から右にグローバルに検索します。一致の間に重なる可能性がある場合は、グローバルgコンテキストで振り返らないため、正しく機能しません。しかし、ここで処理されるケースは1つだけです。とにかく右側には常にスペースがあり、左側は常にスペースではないものがあります。しかし可能です窒素名前付きの単一文字区切り文字の1つにすることができますが、この場合、1つのスペースはそのまま残ります。

スキャン時にパターンの入力を確認します。最初の一致は3文字、2番目は2文字、3番目は単一のスペースです。(このゲームはいつでも持続できますが)

これらのいずれかが検出された場合、sed最初の2つの一致のうちの1つは過越祭のようにそれ自体で置き換えられますが、3番目の一致は完全に削除されます。そしてため息に。

答え2

たぶん、次のようなものがあります。

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

関連情報