两个看似相同的字符串,但换行符不相等

时间:2020-04-30 23:52:53

标签: bash sed newline

我正在尝试使用bash和sed将用逗号分隔的带引号的字符串列表转换为用换行符分隔的字符串列表。

这是我正在做的事的一个例子:

#!/bin/bash

comma_to_newline() {
  sed -En $'s/[ \t]*"([^"]*)",?[ \t]*/\\1\\\n/gp'
}

input='"one","two","three"'
expected="one\ntwo\nthree" 
result="$( echo "${input}" | comma_to_newline )"

echo "Expected: <${expected}>"
echo "Result: <${result}>"

if [ "${result}" = "${expected}" ]; then
  echo "EQUAL!"
else
  echo "NOT EQUAL!"
fi

我得到的输出是:

Expected: <one
two
three>
Result: <one
two
three>
NOT EQUAL!

我知道这与换行符有关,但我无法解决。如果我将换行符替换为其他字符串,例如XXX,则它可以正常工作,并且bash报告字符串相等。

3 个答案:

答案 0 :(得分:1)

在对我的问题的评论的提示下,我设法弄清了所发生的事情。我非常专注于提出一个有效的sed表达式并确保result是正确的,以至于我没有注意到expected字符串是错误的。

  1. 要在bash字符串中使用\n换行符,必须使用$'one\ntwo\nthree'语法-有关其他解决方案,请参见How can I have a newline in a string in sh?
  2. 我正在针对bash版本3.2.57(Mac OS 10.14.6随附的版本)进行开发。当使用expected="one\ntwo\nthree"分配变量然后回显该变量时,它们在控制台中显示为换行符。较新版本的bash将这些字符串显示为转义字符-因此,我认为这是一个错误,已在更高版本的bash中修复。

答案 1 :(得分:0)

要诊断看似相同的字符串,请尝试将并排的diff输出与每行hexdump格式一个字符组合起来。替换:

else
  echo "NOT EQUAL!"
fi

...具有:

else
    echo "NOT EQUAL!"
    diff -y \
    <(hexdump -v  -e '/1  "%_ad#  "' -e '/1 " _%_u\_\n"' <<< "${expected}") \
    <(hexdump -v  -e '/1  "%_ad#  "' -e '/1 " _%_u\_\n"' <<< "${result}")
fi

答案 2 :(得分:0)

从您的函数中恢复的字符串中还有多余的换行符\n

杂物堆

$echo '"one","two","three"' | sed -En $'s/[ \t]*"([^"]*)",?[ \t]*/\\1\\\n/gp' | od -c 
0000000   o   n   e  \n   t   w   o  \n   t   h   r   e   e  \n  \n
0000017
$echo "one\ntwo\nthree"  |  od -c 
0000000   o   n   e   \   n   t   w   o   \   n   t   h   r   e   e  \n
0000020
$

另外,使用echo -e

$echo "one\ntwo\nthree"  
one\ntwo\nthree
$echo -e "one\ntwo\nthree"  
one
two
three
$

man页上

-e启用反斜杠转义的解释