我在 Linux 系统上有一个数据库控制文件,我想过滤掉它(用于培训目的)。但是,我无法找到摆脱“块状”字符的正确方法:
▒▒▒▒
▒▒▒▒
▒▒▒▒
▒▒▒▒▒
▒▒▒{
▒▒▒▒▒▒9
▒▒▒▒
▒▒▒▒▒
我尝试了很多方法,但它们没有摆脱块字符:
258 strings o1_mf_d3rrgv0l_.ctl|grep -vE '▒'
259 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|?|+|(|)|<|>'
260 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|(|)|<|>'
261 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>'
262 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!'
263 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`'
264 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\$'
265 strings o1_mf_d3rrgv0l_.ctl|grep -v '[^[:print:]]'
266 strings o1_mf_d3rrgv0l_.ctl|grep -v '[[:print:]]'
267 strings o1_mf_d3rrgv0l_.ctl|grep '[[:print:]]'
268 strings o1_mf_d3rrgv0l_.ctl|grep -v '[[:cntrl:]]'
269 strings o1_mf_d3rrgv0l_.ctl|grep -v '\x{09}'
270 strings o1_mf_d3rrgv0l_.ctl|grep -vP '[^\x00-\x7f]'
271 strings o1_mf_d3rrgv0l_.ctl|tr -dc '\007-\011\012-\015\040-\376'
272 strings -1 o1_mf_d3rrgv0l_.ctl|tr -dc '\007-\011\012-\015\040-\376'
273 strings o1_mf_d3rrgv0l_.ctl|tr -dc '[:print:]\n\r'
274 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\$'
275 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\;|\:|\=|\$'
276 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\;|\:|\=|\$|\"'
277 strings o1_mf_d3rrgv0l_.ctl|grep -vE '@|\?|\+|\(|\)|\<|\>|!|\^|\%|\`|\;|\:|\=|\$|\"|\&|\#'
答案1
删除除“已知良好”字符之外的任何内容可能会更容易。例如,将输出限制为标准 ASCII 字符,您可以使用
tr -dc '[^ -~\012\015]'
这只会保留 SPACE 和 ~(字符 126)之间的字符以及 CR/LF 字符。其他所有内容都将被删除。
或者,您可能想将它们替换为另一个字符,例如空格
tr -c '[^ -~\012\015]' ' '
这将保留任何缩进级别
最后,您可能会看到这个,因为语言环境设置;例如,如果操作系统认为您有 UTF8 但终端没有,那么您可能会看到这一点。
因此LANG=C
在运行命令之前进行设置可能会改变输出
LANG=C strings o1_mf_d3rrgv0l_.ctl
这将改变该strings
命令所认为的可打印字符。
答案2
经过一段有趣的旅程后,我希望这能用 GNU 回答你的问题grep
:
样本file.txt
:
▒▒▒▒
▒▒▒▒
▒▒▒▒
foo
bar
@▒^@^@▒▒^@^@^@^@^@^@^@^@^@^@<▒^@^@^@^@@^@^@^@^D~z{|}^@^@^▒^@^@^@^@^@^@^@^@^@^@
$ grep -v $(printf %b \\U2592) file.txt
foo
bar