我想从文件中读取行并将字符串附加到其中。但它没有正确附加。
#! /bin/bash
FILE=$1
while IFS= read -r line
do
line2="${line} &"
echo $line2
done <$FILE
我的输入文件包含
message
sample
text
预期产出
message &
sample &
text &
但是执行脚本后我得到的输出低于。
&ssage
&mple
&xt
为什么不在末尾附加字符串?
答案1
&ssage
&mple
&xt
问题是您的输入文件(显然是在 Windows 中创建的)具有 CRLF 行结尾。
修复它sed -i 's/\r//' file
答案2
您的问题是输入文本文件是 DOS 文本文件。这意味着每行以回车符结束。输出时,该字符使光标回到行首,也就是说,echo
输出 之前的空格时&
,会将其写入行首。
您应该使用类似 的工具将文本文件转换为 Unix 文本格式dos2unix
。
当您输出 的值时,您还会遇到在 shell 代码中引用的问题$line2
。由于您没有引用变量扩展,因此 shell 会将其值拆分为空格、制表符和换行符以生成单词。这些单词在作为单独的参数传递给echo
.这意味着输入中的任何制表符或一组以上的连续空格都将转换为单个空格,并且输入中恰好与一个或多个现有文件名匹配的任何通配模式都将被这些文件名替换。例如,尝试使用一行输入,*
上面有一个。
在某些情况下,该echo
实用程序倾向于修改其输出的数据(扩展\n
到文字换行符等),因此如果您想保留输入的文字数据,则应该使用它printf
。
在 shell 循环中逐行读取文本效率也有点低,并且您的任务最好通过诸如sed
、
sed 's/$/ \&/' <"$1"
(用空格和 & 符号替换行尾)
... 或者awk
,
awk '{ printf "%s &\n", $0 }' <"$1"
(输出每行带有空格并&
添加;也可以使用print $0, "&"
)。
也可以看看:
答案3
我无法重现这个。
我只是在本地运行了它,还制作了一个可以轻松试用的版本https://www.onlinegdb.com/online_bash_shell。
while IFS= read -r line
do
line2="${line} &"
echo $line2
done <<EOM
message
sample
text
EOM
输出
message &
sample &
text &