sed:匹配特殊颜色字符

sed:匹配特殊颜色字符

我有一个包含特殊颜色编码字符的文件:

$ cat zz
aaa.gpg
bbb.gpg
ccc.gpg

$ cat -A zz
^[[38;5;216maaa.gpg^[[00m$
^[[38;5;216mbbb.gpg^[[00m$
^[[38;5;216mccc.gpg^[[00m$

我需要使用sed命令来匹配结尾.gpg并将其删除。所以,如果没有特殊字符,我会使用:

cat zz | sed 's/\.gpg$//'

那么我怎样才能将.gpg^[[00m$模式与匹配呢sed

我尝试了所有可能的排列,但仍然不起作用。例如:

cat zz | sed 's/\.gpg\^\[\[00m$//'

答案1

c=$(printf '\\(\33\\[[0-9;]*m\\)*')

将存储在$c与任意数量的图形属性设置序列(着色、粗体、反向视频...)匹配的正则表达式中,也称为 sgr (设置图形呈现)。

然后:

sed "s/${c}\.${c}g${c}p${c}g\(${c}\)\$/\5/"

将删除尾部.gpg,包括散布的和前面的 SGR 序列,但保留尾部序列(例如\e[00m(sgr0) 来恢复默认图形再现)。

答案2

为了删除 ansi 序列(颜色和移动),我们可以沿着以下方式运行一些东西

perl -pe 's/\e\[[0-9;]*[mGKHF]//g'

在那之后,事情就变得更加清晰了……

答案3

您在终端上看到的是^[转义字符。第二个[是一个[.

您需要包含转义代码。

将 替换^[为转义字符。

esc="$(echo '\033')"
sed 's/\.gpg'"${esc}"'\[00m$//'

或者

esc='\x1b`
...

答案4

我假设您想将转义序列保留在原处(如果它们已经存在)。你可以这样做:

sed -E 's/\.gpg([[:cntrl:]]|$)/\1/' zz

这将匹配.gpg随后任何一个行尾或者任何控制字符(例如 ESC 字符)。如果控制字符匹配,则在替换时将保留该控制字符\1

如果没有转义序列,那么.gpg行尾处也将被删除。

相关内容