如何断言字符串有换行符,如果有,将其删除

far*_*d99 10 bash string

我有一个字符串,它是我无法控制的某些操作的结果。当我使用 打印这个变量时echo,我得到:

echo $myvar
hello
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时

if [ $myvar = "hello" ]; then
    echo they are equal
else
    echo they are not equal
fi
Run Code Online (Sandbox Code Playgroud)

我总是明白他们是不平等的。我怀疑这是因为一个newline角色。

字符串的行为也很奇怪。当我做:

newVAR="this is my var twice: "$myvar$myvar
echo $newVAR
Run Code Online (Sandbox Code Playgroud)

我得到:

hellois my var twice: hello
Run Code Online (Sandbox Code Playgroud)

我如何检查这是否确实是由 a 引起的newline,如果是,则将其删除?

Pet*_*r.O 10

问题是您有一个嵌入式回车符 (CR, \r)。这会导致终端文本插入点回到它正在打印的行的开头。这就是为什么您会在$newVAR示例中的行首看到“hello”的原因-sed -n l显示不可打印字符(和行尾)的可读视图。

var=ab$'\r'c ; echo "$var";  printf %s "$var" | sed -n l
# output:
cb
ab\rc$
Run Code Online (Sandbox Code Playgroud)

您可以使用简单的 bash 条件检查来测试它:

[[ $var == *$'\r'* ]] && echo yes || echo no
# output:
yes
Run Code Online (Sandbox Code Playgroud)

您可以通过测试\r(s) 并通过以下方式将其删除,从而在一个步骤中组合测试和修复:

fix="${var//$'\r'/}"; echo "$var"; echo "$fix"
# output:
cb
abc
Run Code Online (Sandbox Code Playgroud)

修复程序使用Shell Parameter Expansion。上面所用的特定形式是用于替换基于你proovided图案子:${parameter/pattern/string}< -这仅替换第一个找到的图案在名为*参数变量。要替换所有模式,您只需要将第一个更改///.


yae*_*shi 5

你可以表示\r$'\r'在bash:

if [ "$myvar" = "hello"$'\r' ]; then
    echo they are equal
else
    echo they are not equal
fi
Run Code Online (Sandbox Code Playgroud)

剁最后\rmyvar

if [ "${myvar%$'\r'*}" = "hello" ]; then
    echo they are equal
else
    echo they are not equal
fi
Run Code Online (Sandbox Code Playgroud)