如何使用 sed 删除文档中的垃圾字母?

如何使用 sed 删除文档中的垃圾字母?

我有一个列表,它实际上是一个媒体程序的输出,我想删除所有垃圾,以便我可以将该列表用于我的 Zenity 脚本,但在一个字符串中涉及很多 sed 命令,这是我喜欢的方式,我打开任何仅涉及 sed 的建议。

我将准确解释我想要实现的成功:

实际列表是列表.txt: 在此处输入图片描述 * 只是十六进制 1b

*line here is not needed*
*[1m0  *[22m : *[35mThis has SPACES inside, Must be DOTS!*[39m : *[34m123.123ABCD*[39m
*[1m1  *[22m : *[35mThis-DONT-have(SPACES)-inside*[39m : *[34m900.578CD*[39m
*[1m2  *[22m : *[35mThis SPACE!!! inside, # Must be DOTS!*[39m : *[34m9K99123AD*[39m
*[1m3  *[22m : *[35mSPACES *Must* be DOTS!*[39m : *[34mAB*[39m
*[1m4  *[22m : *[35mMust[be] [DOTS] !*[39m : *[34m12.AZZZ*[39m
*[1m5  *[22m : *[35mSPACES ~DOTS!*[39m : *[34m654KK45*[39m

这是我的 sed 方程:

cat ~/List.txt | sed -e 1d -e 's/\x1b\[1m//g' -e 's/\x1b\[22m : \x1b\[35m/|---|/g' -e 's/\x1b\[39m : /|---| /g' -e 's/.|---|*//' -e 's/|---|*//' -e 's/\x1b*\[34m/(/g' -e 's/\x1b\[39m/)/g' -e 's/^/FALSE /' -e '0,/FALSE /s//TRUE /' > sedList.txt

这是sed列表.txt单词之间有空格:

TRUE 0 This has SPACES inside, Must be DOTS! (123.123ABCD)
FALSE 1 This-DONT-have(SPACES)-inside (900.578CD)
FALSE 2 This SPACE!!! inside, # Must be DOTS! (9K99123AD)
FALSE 3 SPACES *Must* be DOTS! (AB)
FALSE 4 Must[be] [DOTS] ! (12.AZZZ)
FALSE 5 SPACES ~DOTS! (654KK45)

我想用特定位置的点替换这些空格(并非全部)所以 sedList.txt 看起来正是像这样:

TRUE 0 This.has.SPACES.inside,.Must.be.DOTS! (123.123ABCD)
FALSE 1 This-DONT-have(SPACES)-inside (900.578CD)
FALSE 2 This.SPACE!!!.inside,.#.Must.be.DOTS! (9K99123AD)
FALSE 3 SPACES.*Must*.be.DOTS! (AB)
FALSE 4 Must[be].[DOTS].! (12.AZZZ)
FALSE 5 SPACES.~DOTS! (654KK45)

那么我的 sed 方程式缺少什么我应该添加什么吗?

答案1

我想你已经差不多到了,我只是先用点替换了所有空格。

sed -e 1d \
        -e 's/\s/./g' \
        -e 's/x1b\[1m0/TRUE 0/g' \
        -e 's/x1b\[1m/FALSE /g' \
        -e 's/\.\./ /g' \
        -e 's/\!x1b\[39m/\!/g' \
        -e 's/x1b\[34m/\(/g' \
        -e 's/x1b\[39m/\)/g' \
        -e 's/x1b\[22m\.\:\.x1b\[35m//g' \
        -e 's/\.\./\./g' \
        -e 's/\.\:\./ /g' \
~/List.txt > SEDList.txt

答案2

既然你要求sed

sed -re 1d \
  -e 's/\x1b\[[0-9]+m//g' \
  -e 'y/ /./' \
  -e 's/^([0-9]+)\.*:\./FALSE \1 /'\
  -e 's/\.:\.(.*)/ (\1)/'\
  -e '1s/FALSE/TRUE/'

答案3

这将产生所需的输出:

sed '1d;s/\x1b\[[0-9]*m//g;s/  *: /\n/g;y/ /./;s/^/FALSE /;2s/FALSE/TRUE/;s/$/)/;s/\n/ /;s// (/' yourfile

我给你的提示:

  • 首先:不要将cat和 管道连接到sed。而是将文件名作为 的参数传递给sed
  • 接下来,使用正则表达式一次性处理所有转义序列,以\x1b\[[0-9]*m简化脚本
  • 避免使用像 这样的“神奇”模式|---|。使用 GNU,sed你可以改用换行符。这是独一无二的,而且易于处理。

评论版本:

sed '1d;                # drop the first line
     s/\x1b\[[0-9]*m//g;# remove all esc sequences
     s/  *: /\n/g;      # replace the colons with spaces by newlines
     y/ /./;            # replace the spaces with dots
     s/^/FALSE /;       # add the `FALSE` to the beginning
     2s/FALSE/TRUE/;    # except for the second line
     s// (/;            # first separator becomes space
     s/$/)/;            # second becomes space with (
     s/\n/ /;           # finally the trailing )' yourfile

答案4

我认为这个问题由两个问题组成:(1)删除 ansi-seq 和(2)调整和清理格式。第一部分使第二部分变得模糊。

这里仅给出部分答案:我建议使用ansifilter对 ansi 序列进行初步清理:

ansifilter ~/List.txt | ...

相关内容