我有一个列表,它实际上是一个媒体程序的输出,我想删除所有垃圾,以便我可以将该列表用于我的 Zenity 脚本,但在一个字符串中涉及很多 sed 命令,这是我喜欢的方式,我打开任何仅涉及 sed 的建议。
我将准确解释我想要实现的成功:
*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 | ...