我想清理一些文件,并使它们的编写方式更加统一。
所以,我的输入可能看起来像这样:
$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'