Как удалить невидимые символы в bash (tr и sed не работают) - PullRequest
0 голосов
/ 29 мая 2019

У меня много проблем с удалением невидимых символов из ответа:

Вот мой код:

test_id=`clasp run testRunner`
echo "visible"
echo "$test_id"
echo "invisible"
echo "$test_id" | cat -v
echo "invisible2"
echo "$test_id" | tr -dc '[:print:]' | cat -v
echo "invisible3"
echo "$test_id" | sed 's/[^a-zA-Z0-9]//g' | cat -v
echo "invisible4"
printf '%q\n' "$test_id"

Вот вывод:

visible
1d5422fb
invisible
^[[2K^[[1G1d5422fb
invisible2
[2K[1G1d5422fbinvisible3
2K1G1d5422fb
invisible4
$'\E[2K\E[1G1d5422fb'

редактировать: я нашел решение по ссылке в комментариях, спасибо

echo "solution"
echo "$test_id" | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | cat -v

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Следующий код работает с вашим примером:

shopt -s extglob
test_id=$'\e[2K\e[1G1d5422fb'
test_id="${test_id//$'\e['*([^a-zA-Z])[a-zA-Z]}"
echo "$test_id" | cat -v

Важной частью является третья строка, которая применяет подстановку строк к расширенной переменной. Соответствует (и удаляет) все вхождения шаблона

  • $'\e[' - один символ Esc , за которым следует [
  • *( ... ) - (это то, для чего требуется extglob) ноль или более вхождений ...
    • [^a-zA-Z] - один неалфавитный символ
  • [a-zA-Z] - один буквенный символ

В вашем примере это избавляет от двух escape-последовательностей \e[2K (стереть строку) и \e[1G (переместить курсор в столбец 1).

0 голосов
/ 29 мая 2019

Вместо удаления escape-последовательностей не допускайте их генерации, что, я думаю, вы можете сделать с

test_id=$(TERM=dumb clasp run testRunner)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...