从Windows文件中提取目录时,cd命令失败

我有一个窗口中的文本文件,其中包含我需要提取的许多目录。 我尝试提取一个目录,并试图在shell脚本中cd ,但cd命令失败,提示cd: /VAR/GPIO/: No such file or directory

我已经确认该目录存在于我的本地PC和目录是正确的(虽然它是相对的)。 我也search了很多,似乎在提取文件中存在一些特殊的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 on /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/ 

错误消息cd: /VAR/GPIO/: No such file or directory表示存储在$templt_dir中的名称不存在。

这实际上是由于包含非打印ANSI转义序列的字符串。 您需要从包含目录的字符串中删除这些字符。

我从这个Unix和Linux的答案中发现了下面的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" sed -r "s#$templt_name##; s#\".*##; s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"-n sed选项和p如果只有一行正在处理,sed命令可以省略,但是如果没有原始文件,我不能测试它)。

使用sed 去除 ANSI转义序列的其他方法在使用sed 去除颜色代码(特殊字符)中列出。

但是,更好的长期修复方法是修改创建列出目录的文本文件的过程,以便在其输出中不包含ANSI Escape代码。