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

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

Я точно объясню, что я пытаюсь преуспеть:

Фактический список - List.txt: * - это просто hex 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

Это List.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
задан 24 October 2017 в 15:28

10 ответов

В то время как следующее не так быстро, как один вызов 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

Как одна строка, доступная для использования в скрипте.

"$( 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
ответ дан 18 July 2018 в 04:43

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

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

ansifilter ~/List.txt | ...
0
ответ дан 18 July 2018 в 04:43

Поскольку вы запрашиваете 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
ответ дан 18 July 2018 в 04:43

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

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
ответ дан 18 July 2018 в 04:43

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

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
ответ дан 18 July 2018 в 04:43

В то время как следующее не так быстро, как один вызов 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

Как одна строка, доступная для использования в скрипте.

"$( 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
ответ дан 24 July 2018 в 18:09

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

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

ansifilter ~/List.txt | ...
0
ответ дан 24 July 2018 в 18:09

Поскольку вы запрашиваете 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
ответ дан 24 July 2018 в 18:09

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

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
ответ дан 24 July 2018 в 18:09
  • 1
    Могут ли SED-строки синтаксироваться так: echo & quot; $ TheList & quot; | sed -e ... -e ... -e Подробнее о том, как список синтаксис в моем скрипте: VAR = $ (zenity ... ... ... $ (echo & quot; $ TheList & quot; | sed - e ... -e ... -e)) – GoldHaloWings 24 October 2017 в 13:40
  • 2
    Это не вопрос sed, а выход изнутри $(...) – Philippos 24 October 2017 в 15:29

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

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
ответ дан 24 July 2018 в 18:09
  • 1
    Получите все смять с точками и гексами, см. Мои примеры выше, см. SEDList.txt, как следует выглядеть – GoldHaloWings 24 October 2017 в 00:06
  • 2
    @GoldHaloWings Я просто испытал это, и он отлично работает. Возможно, вам понадобится заменить x1b s в этом ответе на \x1b. – wjandrea 24 October 2017 в 04:53
  • 3
    @wjandrea Что, черт возьми? Когда я тестировал с zenity с фактическим списком вывода (из медиапрограммы), он не работал, а затем я тестировал его с помощью List.txt, который работал. Я не понимаю, так работает, но не работает с фактическим выход, я думаю? – GoldHaloWings 24 October 2017 в 14:26
  • 4
    @J. Строка Starnes SED, работающая только с List.txt, не с фактическим результатом, ваш ответ правильный, спасибо. – GoldHaloWings 24 October 2017 в 14:28
  • 5
    @J. Starnes уверен, что это связано с тем фактом, что x1b должен быть / \ x1b pls смотреть выше моего плохого уравнения sed плюс опубликовать изображение пример текста, чтобы получить идею – GoldHaloWings 24 October 2017 в 15:04

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

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