我将一个特定的字符串加载到变量(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