如何从shell脚本中的变量中删除回车

Posted

技术标签:

【中文标题】如何从shell脚本中的变量中删除回车【英文标题】:How to remove carriage return from a variable in shell script 【发布时间】: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' 【参考方案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 expansion和ANSI-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)。

【讨论】:

你不能像这样使用 sed 删除\n。见sed.sourceforge.net/sedfaq5.html#s5.10【参考方案6】:

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

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

testVar=$testVar%$NL    # removes trailing 'NL' from string

【讨论】:

问题是回车,而不是换行。 所以 NL=$'\n' 和 NR=$'\r' 并替换两者,在找不到条件下什么也没有发生

以上是关于如何从shell脚本中的变量中删除回车的主要内容,如果未能解决你的问题,请参考以下文章

请教一个批量删除文本文件中多余回车或提取文本中前两行数据的shell脚本,请高手指点,万分感谢

如何查看ubuntu shell环境变量

shell脚本里,如何删除变量的最后一个字符?

Shell 脚本 - 从变量中删除第一个和最后一个引号 (")

在shell脚本里如何表示回车

如何用shell脚本语言去截取字符串