我有一个包含特殊颜色编码字符的文件:
$ 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
行尾处也将被删除。