如何从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
。我无法下载dos2unix
,tr
无法正常工作,什么不行!非常感谢!
我使用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脚本,请高手指点,万分感谢