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

cd command fails when directory is extracted from windows file

我在 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/

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

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

我从 this Unix and Linux answer

中找到了以下 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 命令,但我无法测试它没有原始文件)。

使用 sed 去除 ANSI 转义序列的其他方法列于 Remove color codes (special characters) with sed

但是,更好的长期解决方法是修改创建列出目录的文本文件的过程,使其输出中不包含 ANSI 转义码。