我有一个窗口中的文本文件,其中包含我需要提取的许多目录。 我尝试提取一个目录,并试图在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代码。