【问题标题】:How to remove carriage return from a variable in shell script如何从shell脚本中的变量中删除回车
【发布时间】:2021-04-19 12:52:40
【问题描述】:

我是 shell 脚本的新手。我正在使用source 命令获取一个在Windows 中创建并具有回车符的文件。在我添加一些字符后,它总是出现在行首。

test.dat(末尾有回车):

testVar=value123

testScript.sh(以上文件来源):

source test.dat
echo $testVar got it

我得到的输出是

got it23

如何从变量中删除'\r'

【问题讨论】:

  • 当你在Windows中编写了Linux脚本时,你需要将整个文件进行转换,以便在运行之前删除所有的回车符,否则你会遇到各种各样的问题。尝试替换单个回车可能会解决一些问题,但会出现其他问题。对我来说,通常是关于被截断的行的消息。因此,最好使用dos2unix 之类的程序转换整个文件。
  • 它当然是旧的,但这个 oneliner 也应该这样做。 echo ${testVar%'\r'}

标签: shell unix


【解决方案1】:

另一个解决方案使用tr:

echo $testVar | tr -d '\r'
cat myscript | tr -d '\r'

选项-d 代表delete

【讨论】:

    【解决方案2】:

    您可以按如下方式使用 sed:

    MY_NEW_VAR=$(echo $testVar | sed -e 's/\r//g')
    echo ${MY_NEW_VAR} got it
    

    顺便说一下,尝试在你的数据文件上做一个dos2unix

    【讨论】:

    • 我实现了这个,它删除了每个“r”,而不仅仅是回车。
    • 您确定保留 \ 吗?
    【解决方案3】:

    由于您获取的文件以回车结束行,$testVar 的内容可能如下所示:

    $ printf '%q\n' "$testVar"
    $'value123\r'
    

    (第一行$是shell提示符;第二行$来自%q格式化字符串,表示$'' quoting。)

    要去掉回车,可以使用shell parameter expansionANSI-C quoting(需要Bash):

    testVar=${testVar//$'\r'}
    

    这应该会导致

    $ printf '%q\n' "$testVar"
    value123
    

    【讨论】:

    • 出于某种原因我需要 \n 而不是 \r ...
    • @DavidGoodwin 很奇怪。 printf '%q\n' "$testVar" 的输出是什么样的?
    • $'include:(\n .......blah blah .... )\n)' (我的多行字符串是由sh VAR=$(cat <<EOF include:( .... blah blah ..... EOF ) 制成的
    • @DavidGoodwin 但是您是否有要删除的回车符?
    • Aaaaaaaaaaah :lightbulb: 等等。谢谢 :)
    【解决方案4】:

    将脚本文件复制到 Linux/Unix 后在脚本文件上使用此命令

    perl -pi -e 's/\r//' scriptfilename
    

    【讨论】:

    • 非常感谢perl。我无法下载dos2unixtr 无法正常工作,什么不行!非常感谢!
    • 我使用perl -p -e 's/\r\n$//' 仅从输入的末尾修剪\r\n
    【解决方案5】:

    管道到 sed -e 's/[\r\n]//g' 以从每个文本行中删除回车符 (\r) 和换行符 (\n)。

    【讨论】:

    【解决方案6】:

    对于一个不调用外部程序的纯shell解决方案:

    NL=$'\n'    # define a variable to reference 'newline'
    
    testVar=${testVar%$NL}    # removes trailing 'NL' from string
    

    【讨论】:

    • 问题是回车,而不是换行。
    • 所以 NL=$'\n' 和 NR=$'\r' 并替换两者,在找不到条件下什么也没有发生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多