根据特定条件删除文件中的空格

根据特定条件删除文件中的空格

我想清理一些文件,并使它们的编写方式更加统一。

所以,我的输入可能看起来像这样:

$a$h$l)r
^9 ^5 升
\ 乌尔德

问题是,有些空格是“不必要的”,使得比较文件变得困难。因此,我想删除所有空格,除非它们直接位于以下字符之一之后:

$
^
@
!
/
(
)

例如$<space>,在 中,应保留空格。

或者,如果空格是以下字符之一之后的第二个字符:

i 
o 
s
=
%

例如,在 中iA<space>,空间会保留下来。在 中iC<space><space>,只有第一个空格可以保留。

然后还有一个角色,

s

其中<space>可以作为第一个或第二个字符。

然而,还有一个额外的困难 - 在所有这些情况下,符号或字母都是命令。它们后面的字符是变量。命令也是如此$,在 的情况下$$,第一个美元符号是命令,第二个是变量。因此,在 的情况下,$$<space>即使它跟在 $ - 后面,也应该删除空格,因为它后面的 $ 是前一个 $ 的变量。对于第一个列表中的所有“命令”都是如此 - 它们后面总是紧跟着一个变量。因此,这同样适用于例如^$<space>。在这种情况下应该删除空格,因为 $ 是 ^ 的变量。

第二个列表中的项目以及s第二个列表中的 始终后面跟着两个变量。因此,例如ss<space><space>应该变成ss<space>,因为第二个 s 是一个变量。

这个问题仅会出现在第一个列表中的字符和 中s,因为第二个列表中的命令永远不会直接跟随也充当命令的字符。

除此之外,还有其他未列出的命令。然而,它们并不相关,因为它们后面不能有空格。空间本身也不构成命令。

我知道这很令人困惑,但我很乐意澄清您可能有的任何答案。

因此,示例输入可能是:

:
$$$N
$$$a
$$ $^ $i
单反相机
*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'

相关内容