如何删除bash中的不可见字符(tr和sed不起作用)

时间:2019-05-29 17:12:24

标签: bash

我在从响应中删除不可见字符时遇到很多问题:

这是我的代码:

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 个答案:

答案 0 :(得分:1)

以下代码适用于您的示例:

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]-一个字母字符

在您的示例中,这消除了两个转义序列\e[2K(擦除行)和\e[1G(将光标移至第1列)。

答案 1 :(得分:0)

代替删除转义序列可以防止生成转义序列,我想您可以这样做

test_id=$(TERM=dumb clasp run testRunner)