我在从响应中删除不可见字符时遇到很多问题:
这是我的代码:
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
答案 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)