使用 tr 重新分配变量并去掉换行符和回车符

使用 tr 重新分配变量并去掉换行符和回车符

我将一个特定的字符串加载到变量(v1)中。我想定义一个等于该变量减去新行和回车符的新变量,因此我需要从分配新变量的字符串中删除新行和回车符。

这是我想要做的示例(--> 表示终端输出):

v1="Hello\nThere" 

v2=  $(echo $v1 | tr -d '/n')  #This yields the error below.
--> bash: Hello\nThere: No such file or directory

同样,如果我尝试替换“l”而不是“/n”,我会得到:

v2=  $(echo $v1 | tr -d l)
--> bash: Heo\nThere: No such file or directory 

请注意,“l”在第二个示例中消失了,但是弹出了“没有这样的文件或目录”,我不知道它的含义。在这种情况下这表明什么?它正在寻找什么文件或目录?我只是将 echo 的结果传送到 tr 中。当它谈论“没有这样的文件或目录”时,我不确定它指的是什么。

此外,如果我只是这样做而不分配新变量,它就可以工作

echo $v1 | tr -d l
-->   Heo\nThere

我在这里正确分配新变量吗?我使用的格式 VariableName= $(表达式)

答案1

v1="Hello\nThere" 

首先,这按字面意思设置v1为字符串Hello\nThere,中间有一个反斜杠。要包含文字换行符,您可以使用(在 Bash/Ksh/Zsh 中):

v1=$'Hello\nThere'

或(POSIXly):

v1='Hello
There'

然后,这个:

v2=  $(echo $v1 | tr -d '/n') 

类似于v2= somecommand,它类似于,即它在命令的环境中v2=value somecommand运行带有 set 的命令。v2使用您所拥有的行,它扩展了命令替换,对其进行分词和通配,将其Hello\nThere作为第一个也是唯一的单词,并尝试将其作为命令运行(v2在其环境中设置为空字符串)。

这会失败,因为路径中没有Hello\nThere,因此错误消息显示Hello\nThere: No such file or directory.

您不能在 shell 变量赋值中使用空格,您需要使用v2=$(...).另外,您应该在变量扩展周围加上引号,并且您可能打算\n在 的参数中使用tr,并且也\r删除回车符:

因此,例如使用 Bash,这将打印“Hellothere”:

#/bin/bash
v1=$'Hello\nthere'
v2=$(echo "$v1" | tr -d '\n\r')
printf "%s\n" "$v2"

虽然如果我们可以使用$'',我们也可以使用${var/pattern/replacement}扩展来删除换行符和回车符:

#/bin/bash
v1=$'Hello\r\nthere\r\n'
v2=${v1//[$'\n\r']}
printf "%s\n" "$v2"

(双斜杠替换所有匹配项,如果没有替换部分,则匹配项将被删除。请注意,括号[]不应加引号,因为我们希望它们保留其模式匹配含义,但内部\n\r必须在以内才能$''被视为 NL 和CR,而不仅仅是反斜杠和字母。)

看:

答案2

您想要的命令是这些:

v1="Hello\nThere"

v2=$(echo $v1 | tr -d '\\n')

按照您的方式,\n被解释为文字\n而不是换行符,这会导致错误。使用\\n可以解决这个问题。

您可以事后验证:

echo $v2

输出:

HelloThere

相关内容