使用tr从文本文件中删除隐藏的字符,同时保留latin-2

问题描述 投票:0回答:1

我有一些带有隐藏字符的文本文件,可以通过以下命令将其删除:

tr -cd '\11\12\15\40-\176' < initial_file > final_file

如果我可以保留拉丁2个字符,此命令将是完美的。我在tr手册页中找不到有关6位数八进制的信息。如何将具有八进制值的字符(例如\ 305 \ 237或\ 303 \ 256)添加到该tr命令?

我需要保留此列表:

\304\202 Ă
\304\203 ă
\303\216 Î
\303\256 î
\303\202 Â
\303\242 â
\305\236 Ş
\305\237 ş
\305\242 Ţ
\305\243 ţ

我的系统语言环境是en_US.UTF-8。我有几位翻译的字幕,我用ffmpeg脚本将它们刻录到视频上。一切正常,直到一些翻译员交付字幕时出现了一个小问题:在VLC中我看不到它,但是在用ffmpeg刻录后,每行前面都有一个不需要的字符。我无法复制该字符并使用sed将其删除,因为它已在输出视频中被刻录。如果我在该字幕上运行cat -v,我会在每行前面看到M-bM-^@M-^N

bash ffmpeg tr iso-8859-2
1个回答
0
投票

似乎您具有UTF-8编码的文件,只想保留恰好符合latin2标准的字符。这些字符在latin2中的编码无关紧要。

如果是这种情况,则不能使用tr。 UTF-8将大多数这些字符编码为两个字节,但是tr只能替换单个字节。使用sed代替:

sed 's/[^\r\t -~ĂăÎîÂ⪺Ţţ]//g' infile > outfile

以上命令假定您的终端使用UTF-8(使用命令locale检查,并且文件也以UTF-8编码。

但是也许您实际上想要...

tr -d '[:cntrl:]' < infile > outfile

sed 's/[[:cntrl:]]//g' infile > outfile

...删除所有不可打印的字符。无需手动列出要保留的字符。

© www.soinside.com 2019 - 2024. All rights reserved.