回车符阻止 sed 读取我的所有文件

回车符阻止 sed 读取我的所有文件

我有一个很长的文件夹列表,每个文件夹中都有文件“log.dat”。我想读取该文件中特定行的值。我将文件夹名称保存在父文件夹中的文件“All.txt”中,然后运行以下代码:

#!/bin/bash
in=/a/b/c   #path to the file All.txt  
for i in $(cat $in/all.txt); do
sed -n '/price/p' ${in}/${i}/log.dat

done

这段代码能够读取几乎所有文件,但由于某种原因,我无法弄清楚!输出了以下错误消息:

/log.dat: No such file or directory #(then the path to this file)

sed -n '/price/p' log.dat如果我在输出错误消息的文件夹内运行命令。我得到答案了!

PS:ALL.txt文件(在父文件夹中运行命令创建)内容ls>All.txt如下:

STR-548-021-01
STR-548-021-02
STR-548-022-01
STR-548-022-02
STR-548-023-01
STR-548-023-02
.
.
.
.
.

我尝试使用命令“awk”而不是“sed”,如下所示:

awk '{ price }' ${in}/${i}/log.dat

我收到了同样的错误消息。

这些回车符可以作为命令 ls>All.txt 的输出出现在 Linux 中吗?

答案1

回车在 的末尾$i,因为 中的行末尾有回车符all.txt。它可能是在 Windows 上生成的:Windows 使用两个字符序列 CR、LF 来标记换行符,而 Unix(以及世界上的大多数其他地方)仅使用 LF(换行符,Unix 世界中换行符的同义词),所以 Unix 会看到一行末尾带有 CR。

将文件转换为 Unix 行结尾,或去掉 CR:

for i in $(cat $in/all.txt); do
  i=${i%$'\r'}
  sed -n '/price/p' ${in}/${i}/log.dat
done

如果行尾没有 CR,这不会执行任何操作。解释:$'\r' 是一个回车符, 和${i%…} i是减去指定后缀的值

请注意,您的脚本需要空格分隔的输入,而不是每行一个文件,并且输入是通配符模式列表,而不是文件名。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?。如果输入中没有空格或通配符,这没有什么区别。

答案2

您的错误消息表明 sed 正在获取 /log.dat 的参数 - $i 或 $in 都没有设置为任何值。我认为您的 All.txt 文件中有一个空行。

/log.dat: 没有这样的文件或目录#(然后是该文件的路径)

相关内容