49

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

test.dat(最后有回车):

testVar=value123

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

source test.dat
echo $testVar got it

我得到的输出是

got it23

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

4

6 回答 6

86

另一个解决方案使用tr

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

该选项-d代表delete

于 2013-03-20T10:42:32.443 回答
31

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

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

顺便说一句,试着dos2unix对你的数据文件做一个。

于 2013-03-20T10:06:12.370 回答
17

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

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

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

要摆脱回车,您可以使用shell 参数扩展ANSI-C 引用(需要 Bash):

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

这应该导致

$ printf '%q\n' "$testVar"
value123
于 2018-08-03T14:39:29.200 回答
8

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

perl -pi -e 's/\r//' scriptfilename
于 2013-03-20T10:01:22.650 回答
6

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

于 2016-08-29T13:21:48.643 回答
4

对于无需调用外部程序的纯 shell 解决方案:

NL=$'\n'    # define a variable to reference 'newline'

testVar=${testVar%$NL}    # removes trailing 'NL' from string
于 2018-02-27T22:59:22.743 回答