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\\)*')

$csgr(グラフィックレンダリング設定)。

それから:

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行末も削除されます。

関連情報