如何从bash脚本中删除EOL / ^ M / Ctrl-M?

时间:2014-08-25 10:12:15

标签: bash shell unix sed

问题:我需要删除EOL / ^ M / Ctrl-M,它来自在Windows / Dos中编写文档并在Unix中打开它。

目标:我需要读取一个文件并将读取字符串分配给变量,以便我可以将小字符串用作路径名的一部分。我已经阅读了许多关于打开VIM的帖子,但是,这需要通过SOURCED BASH SCRIPT完成,将在多台机器上运行,并且有许多环境变量。所有代码都需要是本机的,因此,没有dos2unix或类似的东西。我还为sed,perl和awk尝试了几行代码;但是,我没有多少运气。任何帮助都会很棒 从终端执行源脚本的示例:

     username#: . ./Do_something.sh  some_string > ~/Do_something_log.txt

让我们假设我们在Do_something.sh

中有以下几行
 #!/bin/bash
 some_string=$1 
 SOME_PATH="${ANOTHER_PATH}/Some/directory_name"
 FILE="${SOME_PATH}/an/even/longer/path/a_file.cfg"

 while read line
 do
      if [ ! -z "{line}" ] ; then
         NEW_PATH_VARIABLE=${line}
         TOTAL_PATH="${SOME_PATH}/${NEW_PATH_VARIABLE}.cfg"
         if [ ! -f "${TOTAL_PATH}" ] ; then
             echo "ERROR. FILE NOT FOUND!!!"
         fi
         if [ "${SOME_STRING}" = "${TOTAL_PATH}" ] ; then
             break
         fi
       fi
 done < ${ANOTHER_FILE}

读取文件后,我的变量名中有一个EOL,因此无法在分配给TOTAL_PATH的变量末尾标记.cfg扩展名。我只注意到^ M,因为我使用

从终端执行的更少
    username#: less ~/Do_something_log.txt

我正在寻找最有效的方法从脚本中删除这些(EOL / ^ M / Ctrl-M)。

由于

1 个答案:

答案 0 :(得分:0)

使用Bash substring replacement

${var/%find/replace}

%要求find值位于字符串的末尾。

NEW_PATH_VARIABLE=${line/%$'\r'/}

$'\r'搜索可以替换为 Ctrl - V Ctrl - M 序列如果需要的话。