我正在尝试使用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报告字符串相等。
答案 0 :(得分:1)
在对我的问题的评论的提示下,我设法弄清了所发生的事情。我非常专注于提出一个有效的sed表达式并确保result
是正确的,以至于我没有注意到expected
字符串是错误的。
\n
换行符,必须使用$'one\ntwo\nthree'
语法-有关其他解决方案,请参见How can I have a newline in a string in sh?。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启用反斜杠转义的解释