Как буквы спама могут быть удалены из документа с sed?

У меня есть список, который является выводом из программы медиа на самом деле, и я хочу удалить весь спам, таким образом, я могу использовать тот список для своего сценария Zenity, но включаю много команд sed в одной строке, которая является способом, которым я предпочитаю, чтобы я был открыт любое предложение, которое включает только sed.

Я объясню точно, за чем я пытаюсь следовать:

Фактическим списком является List.txt: enter image description here * просто шестнадцатеричное число 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 уравнении, я должен добавить что-то?

0
задан 24 October 2017 в 05:28

5 ответов

Этот производит желаемый вывод:

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.
  • Затем, дескриптор все Escape-последовательности сразу с регулярным выражением как \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
1
ответ дан 2 November 2019 в 01:47

Так как Вы просите 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/'
1
ответ дан 2 November 2019 в 01:47

В то время как следующее не с такой скоростью, как сингл 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' )"
0
ответ дан 2 November 2019 в 01:47

Я предполагаю, что Вы были почти там, я просто заменил все пробелы точками сначала.

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
ответ дан 2 November 2019 в 01:47

Я вижу этот вопрос, как составлено из 2 проблем: (1) удалите ansi-seq и (2) скорректируйте и уберите формат. Первая часть запутывает второе.

Здесь давание просто частичного ответа: Я предлагаю использование ansifilter для начальной очистки ansi-последовательностей:

ansifilter ~/List.txt | ...
0
ответ дан 2 November 2019 в 01:47

Другие вопросы по тегам:

Похожие вопросы: