特殊な色で区切られた文字を含むファイルがあります。
$ 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
行末も削除されます。