我在Windows中有一个文本文件,其中包含许多我需要提取的目录。
我尝试提取一个目录,并尝试在shell脚本中cd
,但cd
命令失败,并提示cd: /VAR/GPIO/: No such file or directory
。
我已经确认该目录存在于我的本地PC中并且目录是正确的(尽管它是相对的)。我也搜索了很多,似乎提取文件中存在一些特殊的windows字符。我尝试使用cat -A check
看到它们,结果是 ^[[m^[[K^[[m^[[KVAR/GPIO/$
我甚至不知道m^
或[[K
的含义。
你能帮我解决这个问题吗?我在Windows 7 64位中使用Cygwin。
以下是我的相关审核代码:
templt_dir=$(cat temp | grep -m 1 "$templt_name" |head -1 | sed -n "s#$templt_name##p" | sed -n "s#\".*##p")
echo $templt_dir ###comment, it runs output: /VAR/GPIO/, that's correct!
cd $templt_dir ###comment, cd error prompts
cat temp | grep -m 1 "$templt_name" |head -1 | sed -n "s#$templt_name##p" | sed -n "s#\".*##p" > check ###comment, for problem checking
以下是check
文件的内容:
$ cat -A check
^[[m^[[K^[[m^[[KVAR/GPIO/$
要确认我的目录是否正确,以下是ls -l
上/VAR
的结果:
$ ls VAR -l
total 80K
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 Analog/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:37 Communication/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:10 GPIO/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 HumanInterface/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 Memory/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 PWM/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:10 Security/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 System/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 25 16:25 Timers/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:10 UniversalDevice/
答案 0 :(得分:1)
错误消息cd: /VAR/GPIO/: No such file or directory
表示
存储在$templt_dir
中的名称不存在。
这实际上是由于包含非打印ANSI escape sequences的字符串。 您需要从包含该目录的字符串中删除这些字符。
中找到了以下sed替代品sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
您应该在管道命令中包含:
templt_dir=$(grep -m 1 "$templt_name" temp | sed -n "s#$templt_name##p; s#\".*##p" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
注意:我将两个sed
替换连接到一个命令中,我删除了不必要的cat
。我还删除了多余的head -1
,因为grep -m 1
应该只输出一行。您可以将所有sed替换组合成一个:sed -r "s#$templt_name##; s#\".*##; s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
(-n
sed选项和p
sed命令可以省略,如果只有行正在处理但我无法测试没有原始文件。)
Remove color codes (special characters) with sed列出了使用sed
去除ANSI转义序列的其他方法。
但是,更好的长期修复方法是修改创建文本文件的过程,列出目录中的输出中不包含ANSI转义码。