У меня есть список, который является выводом из программы медиа на самом деле, и я хочу удалить весь спам, таким образом, я могу использовать тот список для своего сценария Zenity, но включаю много команд sed в одной строке, которая является способом, которым я предпочитаю, чтобы я был открыт любое предложение, которое включает только sed.
Я объясню точно, за чем я пытаюсь следовать:
Фактическим списком является List.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
Это - 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)
Я хочу заменить те пробелы точками в определенном месте (не все), таким образом, sedList.txt смотрит exacly как это:
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 уравнении, я должен добавить что-то?
Этот производит желаемый вывод:
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
Так как Вы просите 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/'
В то время как следующее не с такой скоростью, как сингл sed
вызов, оно добавляет гибкость.
sed \
-e 1d \
-re 's/\x1b\[[0-9]+m//g' \
-e 's/:/ /g' List.txt |
awk '{
if ($1=="0")
{printf("TRUE "$1" "); for (i=2; i<=(NF-1); i++) printf("%s%s",".",$i); printf(" ("$NF")\n")}
else
{printf("FALSE "$1" "); for (i=2; i<=(NF-1); i++) printf("%s%s",".",$i); printf(" ("$NF")\n")}
}' |
sed 's/ \./ /g' > SEDList.txt
Как одна строка sutible для использования в сценарии.
"$( sed -e 1d -re 's/\x1b\[[0-9]+m//g' -e 's/:/ /g' "$TheList" | awk '{ if ($1=="0") {printf("TRUE "$1" "); for (i=2; i<=(NF-1); i++) printf("%s%s",".",$i); printf(" ("$NF")\n")} else {printf("FALSE "$1" "); for (i=2; i<=(NF-1); i++) printf("%s%s",".",$i); printf(" ("$NF")\n")} }' | sed 's/ \./ /g' )"
Я предполагаю, что Вы были почти там, я просто заменил все пробелы точками сначала.
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 проблем: (1) удалите ansi-seq и (2) скорректируйте и уберите формат. Первая часть запутывает второе.
Здесь давание просто частичного ответа: Я предлагаю использование ansifilter
для начальной очистки ansi-последовательностей:
ansifilter ~/List.txt | ...