Как удалить ^ [[1m ^ [[22m ^ [[4m ^ [[24m символов при сохранении новой строки? [дубликат]

Вот решение с использованием Bash:

#!/bin/bash

while read pointer; do
 filename="$(echo $pointer | cut -d ' ' -f 1)" 
 if grep $filename list_file > /dev/null; then
  echo $pointer >> output/"$filename".txt
 fi
done < data_file

Вот разбивка по строкам:

  • Строка 3 - это начало используемого цикла while чтобы просмотреть файл_данных.

  • Строка 4 повторяет строку, прочитанную в текущей итерации. Затем строка передается в cut, который вырезает первую часть строки, используя пробел в качестве разделителя. Затем результат присваивается переменной с именем "filename".

  • Строка 5 использует команду grep, чтобы определить, существует ли ранее определенное значение в list_file. Если grep удается найти значение (вернуть статус 0), сценарий переходит к строке 6. Если grep ничего не находит (возвращает статус 1), сценарий запускает цикл заново.

  • Строка 6 отображает всю строку для вывода / "$ filename" .txt.

  • Строка 7 закрывает оператор if.

  • Строка 8 закрывает цикл, и на нее ссылаются data_file.

Другие важные примечания:

  • Каталог «output /» должен быть создан до запуска сценария, иначе вы получите ошибку типа «output: нет такого файла или каталога». Если это проблема, ее можно легко решить, добавив «вывод mkdir» в начало скрипта.
  • Вы упомянули, что файл data_file состоит из сотен тысяч строк. По этой причине выполнение этого сценария, скорее всего, займет много времени. Если вы обнаружите, что часто запрашиваете информацию в этом файле, стоит перевести эту информацию в MariaDB или аналогичную базу данных.
  • Если list_file также содержит много записей, скрипту потребуется безумно много времени для запуска, потому что grep в строке 5 запрашивает весь list_file для каждой итерации цикла. Опять же, это проблема, которую можно решить с помощью инструментов, доступных в базе данных SQL.
1
23.01.2017, 13:28
2 ответа

Решение Тоби Спейта подходит. Немного дополнительной информации:

Обычно это "специальные символы" ansi, используемые для создания цвета, специальных эффектов, позиционирования курсора и т.д. в терминале.

например, grep --color=always '[a-z]*music[a-z]*' files > output выдаст такие символы.

sed -r "s/\x1B\[[0-9;]*[a-zA-Z]//g"

Предложение: проверьте, не установлена ли у вас GREP_COLOR deprecated переменная на --color=always или подобная...

0
27.01.2020, 23:34

Вы хотите удалить CSI . .. m последовательностей. Зная, что они содержат последовательность чисел, разделенных ; , вы можете использовать sed для замены каждого вхождения пустой строкой:

esc=$'\e'
sed "s/$esc\[[0-9;]*m//g" a.txt

Я использую синтаксис Bash для написания escape-символа выше.

3
27.01.2020, 23:34

Теги

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