
私の入力は特別なエスケープ文字を含むパイプから来ます。説明のために、フローは次のとおりです。
printf "foo.bar\033[00m" > file
cat file
末尾を削除する方法は.bar\033[00m
?以下を試しましたが、動作しません。
cat file | sed 's/\.bar\033[00m//'
答え1
ファイルに次の制御文字が含まれている場合
printf "foo.bar\033[00m" > file
次に、特定の単一発生を削除するには、.bar\033[00m
次のようにします。
sed $'s/\.bar\033\[00m//'
ファイル全体からすべてのエスケープシーケンスを削除するには、次の手順を実行します。
sed $'s/\033\[[0-9;]*m//g'
一重引用符で囲まれた文字列の前のドル()は、$'some text'
シェルに文字列の内容にANSI C引用符を適用するように指示しますprintf
。これは、「エスケープされた」ASCII文字(0x1B
/ / ...)を生成する033
ために必要です。
キャラクターはキーボードショートカットで生成することもできます($'
必須ではありません):
sed 's/\.bar
Ctrl-vESC\[00m//'
打撃後に画面に表示するCtrl-vESC必要がありますが、テキストと(2文字)の代わりに制御文字があります。^[
^
[
元の答え
必要に応じてfoo
出力
printf '%s' 'foo.bar\033[00m' | sed 's/\.bar\\033\[00m//'
\
とはすべて[
相手によってエスケープされなければなりません\
。また、入力文字をエスケープコードとANSIカラーとして解釈できるリテラル文字列として印刷'%s'
するために追加しました。printf
\033[
答え2
[
バックスラッシュエスケープと文字を使用する必要があります。\
printf '%s' "foo.bar\033[00m" | sed 's/\.bar\\033\[00m//'
または、文字列からドット文字の後のすべての内容を削除するには、次の手順を実行します。
printf "foo.bar\033[00m" | sed 's/\..*//'