【问题标题】:Unix script appends ^M at end of each lineUnix 脚本在每行末尾附加 ^M
【发布时间】:2013-02-22 09:32:35
【问题描述】:

我有一个 Unix shell 脚本,它执行以下操作:

  1. 创建文件备份
  2. 将一些文本附加到文件中

现在在 #2 中,如果我插入一个文本,^M 会附加到文件的所有行上。

例如:

echo " a" >> /cust/vivek.txt
echo " b" >> /cust/vivek.txt

vi vivek.txt
abc^M
bcd^M
a^M
b^M

有什么办法可以避免吗?

【问题讨论】:

  • 向我们展示脚本如何将文本附加到文件中
  • 您是否在 Windows 机器上创建了这个文件,然后在 unix/linux 机器上传输它?在 MS-DOS 和 Linux/Unix 环境中,行尾的解释不同。在 MS-DOS 上,行结束由换行符和回车表示,而在 Unix 上,换行表示行结束。这会导致 ^M 字符,如果您不注意 MS-DOS 和 Unix/Linux 之间的传输模式
  • 我只从 windows 机器复制了基本文件,现在有什么办法解决这个问题吗?

标签: bash shell unix


【解决方案1】:

我不确定echo 如何生成^M 字符,但您可以通过在文件上运行dos2unix 来删除它们,如下所示:

dos2unix /cust/vivek.txt

【讨论】:

  • 从来不知道dos2unix,对我来说就像一个魅力!干杯
  • echo -e "\r" 产生这样的
【解决方案2】:

^M 是回车符,通常在从 Windows 复制文件时看到。使用:

od -xc filename

这应该给出您的文件外观的低级列表。如果您的文件不是来自 Windows,那么另一种可能性是您的终端设置没有正确翻译。检查 TERM 环境变量是否正确。

如果文件来自 Windows,则使用 dos2unixsed 's/\r//' file > file.new

【讨论】:

    【解决方案3】:

    只有

    sed -e "s/\r//g" file
    

    为我工作

    【讨论】:

      【解决方案4】:

      我怀疑这可能是您的 vi 设置的产物,而不是串联。

      是什么

      cat -v -e filename
      

      显示?此命令将转储您的文件并标记控制字符,以便清楚您的文件中的真正是什么。另见this Superuser question/answer set

      【讨论】:

      • -v = 使用 ^ 和 M- 表示法,LFD 和 TAB 除外; -E = 在每行末尾显示 $; -e = 等价于 -vE;所以 -v -e = -v -vE;多余的?我们不应该只使用“-e”而不是“-v -e”吗?
      【解决方案5】:

      ^M 是在 windows 中使用时进入文件的元字符。

      dos2unix 命令可以解决这个问题。

      dos2unix <filename>
      

      【讨论】:

        【解决方案6】:

        如果您使用的是 windows,您可以使用 notepad++ 并在将文件加载到服务器之前尝试编辑 > EOL 转换 > Unix/OSX 格式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-08
          • 2014-05-29
          • 2021-09-01
          • 1970-01-01
          • 2013-04-05
          • 2015-03-20
          • 2015-05-13
          • 2018-09-17
          相关资源
          最近更新 更多