sh sed replace的问题

时间:2019-05-02 23:40:05

标签: ubuntu sh

我在发布此消息之前进行了搜索,但是找不到任何匹配的问题。看来我的查找和替换操作在无法删除的末尾添加了一个返回字符。呼叫为sh csv2postgres.sh import-tree-references,其中csv2postgres.sh为:

cname=$(printf $1 | sed -e "s/-/_/g")
echo $cname
echo "${cname}.csv"
cols=`head -n 1 "${cname}.csv"`

结果是:

import_tree_references
.csvrt_tree_references
head: cannot open 'import_tree_references'$'\r''.csv'

我尝试了echo / printf,尝试了所有可以想到的“和{}的组合,并尝试添加了管道| tr -d "\r"。如果我仅使用{{1 }},而不是head,并将命令更改为$1,但是我正在使用的应用仍会传递烤肉串。

我正在使用Ubuntu 18.10。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

\r的存在表明MS Windows以某种方式参与其中。

这是三个选项:

  1. 一种方法是更改​​:

    cname=$(printf $1 | sed -e "s/-/_/g")
    

    收件人:

    cname=$(printf "$1" | sed -e "s/\r//g; s/-/_/g")
    

    这将删除有问题的\r

    (请注意,除非您明确希望进行shell扩展,否则所有对shell变量的引用(例如上面的$1都应使用双引号引起来。)

  2. 如果您使用的是bash,而不是sh,则可以不必使用管道和对外部实用程序(sed)的调用:

    cname="${1//-/_}"
    cname="${cname%%$'\r'}"
    
  3. 第三种方法是找到具有Windows行尾的任何文件,然后使用dos2unix之类的实用程序删除这些行尾。

注意:sh不是bash

在许多系统中,sh是到bash的符号链接,但这并不意味着sh的行为类似于bash。为了与以前的名为sh的程序兼容,以名称sh进行调用时,bash的高级功能被关闭,bash试图模仿较早的功能较弱的shell。

来自man bash

  

如果使用名称bash调用sh,它将尝试模仿   sh的历史版本的启动行为与   同时也符合POSIX标准。