使用Shell脚本读取行并删除换行符

10

我有一个 shell 脚本,根据文本文件中的值生成 SQL 查询语句。我的文本文件每行都有以下这些值:

enter image description here

我的 shell 脚本如下:

#!/bin/sh
NAME="tableNames.txt"
COLUMNA="ca"
COLUMNB="cb"
cat $NAME | while read LINE

do
echo "CREATE TABLE \"$LINE\" (
        forward_speed double precision,
    backward_speed double precision
      );"
done

LINE变量从文本文件中正确获取了值,但它包含换行符,如何去掉换行符。


非 Linux 系统中是否存在文件 tableNames.txt - PeterMmm
不,这是在 Linux 系统中,图像是从 Windows 系统中获取的,就是这样。 - smk
这不是 read 命令的行为,所以你的文件可能包含了额外的“换行符”。执行 cat -v tableNames.txt 命令会输出什么? - PeterMmm
4个回答

30

你可能是在Windows机器上或其他带有dos行结尾的设置中生成了文本文件。您可以通过以下两种方式来解决:

  • 使用dos2unix将文件转换为unix行结尾
  • 删除 '\r' 字符:cat $FILE | tr -d '\r' | while read LINE ...
  • 使用像awk这样的实用程序来抓取第一个字段:cat $FILE | awk '{print $1}' | while read LINE ...

你可以稍微改进第二个例子: tr -d '\r' <"$FILE" | while read LINE ... - boly38

2
如果 tabeNames.txt 是来自 Windows 的,你应该使用 dos2unix 过滤器进行转换。

0
一种快速而不太规范的解决方法是在读取命令的末尾添加一个“垃圾”变量来考虑所有情况。如果行末隐藏着一个<cr>,它将被存储在垃圾变量中而不是在其前面的变量末尾;如果没有,则垃圾变量最终将被设置为空字符串。
例如:
read a b c xx < file.txt

将从来源不确定的文件中读取3个以空格分隔的列的值,不会在第三个变量后附加<cr>。


0

我在 Fedora 上使用 Busybox Docker 容器的输出时遇到了问题。

我试图使用 docker run 的输出进行进一步处理,但是多个小时都无法使其正常工作。

最终我通过将输出导入文件来解决了这个问题。

...
res=$(docker run -it ....)
echo $res > tmp.txt
dos2unix tmp.txt
cat tmp.txt | while read line;
do
...

希望这能帮助其他人解决与容器输出类似的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接