【发布时间】:2021-10-13 10:53:59
【问题描述】:
我正在尝试转换每列有两个或多个空格分隔的文件。
YP_010083342.1 - 258 VOG00003 - 582 8.6e-22 80.7 0.2 1 1 5.3e-25 1e-21 80.4 0.2 193 363 5 185 1 251 0.60 anti-repressor protein [Staphylococcus phage LH1]
我想使用 sed 将其转换为 csv。以下 sed 命令对文件没有明显的更改。
sed -i 's/\s+/,/g' file.ouput
sed -i 's/$\s+/,/g' file.ouput
sed -i 's/\t+/,/g' file.ouput
sed -i 's/$\t+/,/g' file.ouput
但以下命令会导致以下结果
sed -i 's/\s\s/,/g' file.ouput
YP_010083342.1,,, -,,,,,,258 VOG00003,,,,,, -,,,,,,582, 8.6e-22, 80.7, 0.2, 1, 1, 5.3e-25,, 1e-21, 80.4, 0.2, 193, 363,, 5, 185,, 1, 251 0.60 anti-repressor protein [Staphylococcus phage LH1]
有谁能解释为什么会发生这种情况以及如何正确解决这个问题?
【问题讨论】:
-
也许尝试使用
\h而不是\s...? -
为什么“使用 sed”是问题的一部分?您真的不会接受使用 awk 或在没有外部工具的纯原生 bash 中实现的答案吗?
-
我很乐意在 awk 或其他工具中得到答案,但我特别想加深对这个 sed 命令如何工作的理解。
-
在这种情况下,最好的位置可能是从relevant POSIX standard 开始。请注意,POSIX 标准化的
sed不支持\s,因此最好避免这种情况。当您想匹配不同类型的空格时,请改用[[:space:]]以获得更好的兼容性。 -
(在上述规范中,您可以找到一个到BRE regex syntax 的链接,它指定了所有符合标准的
sed版本都需要支持的正则表达式格式;有些超出了该标准,但是当您编写该标准时,您知道您的代码将在任何地方运行)。