【发布时间】:2020-04-30 23:52:53
【问题描述】:
我正在尝试使用 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 会报告字符串相等。
【问题讨论】:
-
这就是预期打印输出的结果?不是
Expected: <one\ntwo\nthree>? -
我复制了脚本,我的
Expected同意肖恩的。 -
是的,这就是我得到的。我正在运行:
GNU bash, version 3.2.57(1)-release-(x86_64-apple-darwin18)在 Mac OS 上。但是在Debian上获得<one\ntwo\nthree>GNU bash, version 5.0.3(1)-release (i686-pc-linux-gnu)???? -
我原以为问题出在我的 sed 函数上,但事实证明这是我预期的字符串和旧版本 bash 的问题!
expected=$'one\ntwo\nthree'工作正常! -
请注意,您的变量
expected不包含任何换行符。您可以在设置变量后通过写xxd <<<$expected来验证这一点。