gpt4 book ai didi

ubuntu - sh sed 替换问题

转载 作者:行者123 更新时间:2023-12-04 18:44:31 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Are shell scripts sensitive to encoding and line endings?

(14 个回答)


3年前关闭。




我在发布之前进行了搜索,但找不到任何匹配的问题。看起来我的查找和替换在我无法删除的末尾添加了一个返回字符。电话是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" 。如果我只使用 head 而不是 $1 并更改, cname 命令可以正常工作命令 sh csv2postgres.sh import_tree_references ,但我正在使用的应用程序仍将传递 kebab 案例。

我在 ubuntu 18.10。

有什么建议么?

最佳答案

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

这里有三个选项:

  • 一种方法是改变:
    cname=$(printf $1 | sed -e "s/-/_/g")

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

    这消除了有问题的 \r .

    (请注意,除非您明确需要 shell 扩展,否则所有对 shell 变量的引用,例如上面的 $1,都应该用双引号括起来。)
  • 如果您使用 bash ,而不是 sh ,您可以通过以下方式消除管道和调用外部实用程序 (sed) 的需要:
    cname="${1//-/_}"
    cname="${cname%%$'\r'}"
  • 第三种方法是找到您拥有的任何具有 Windows 行尾的文件,并使用像 dos2unix 之类的实用程序删除这些行尾。 .

  • 注意:sh 不是 bash

    一多系统, shbash 的符号链接(symbolic link)但确实如此 不是 表示 sh行为类似于 bash .为了与以前称为 sh 的程序兼容,当以名称 sh 调用时, bash 的高级功能被关闭,并且 bash 尝试模拟早期功能较少的 shell。

    来自 man bash :

    If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

    关于ubuntu - sh sed 替换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55961535/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com