sed:用换行符替换第一次出现的 space

sed: Replace FIRST occurence of space with newline

我正在尝试用换行符替换每行中 第一次 出现的 space 。

例如

123 there is a monkey
567 there is also a tiger

会变成

123
there is a monkey
567
there is also a tiger

我已经尝试使用以下命令执行此操作:

sed -e 's/^\s\+/\n/g' output.txt > new.txt

运气不好。我也对 linux 中允许我执行此操作的任何其他程序开放,例如 awk、perl 或 bash。

你可以使用这个:

awk '{sub(FS,RS)}1' file
123
there is a monkey
567
there is also a tiger

它改变了记录选择器的第一个字段分隔符。

不要将正则表达式锚定在行首并放弃 g 标志:

sed -e 's/\s\+/\n/' output.txt > new.txt

编辑:BSD sed 部分因为痛苦而被删除。

您可以使用:

sed $'s/ \{1,\}/\\n/' file
123
there is a monkey
567
there is also a tiger

这在 BSD 和 gnu sed 上都有效。

很多答案适用于 GNU sed 但不适用于 BSD sed(例如您将在 Mac 上找到)。例如,BSD sed 不会将 \n 变成文字换行符。假设您使用 bash 或现代 ksh,您可以使用 ANSI 字符串 $'...' 来解决该问题。以下所有答案都适用于任一版本。

首先,如果您确定它只是一个 space,您可以这样做:

sed $'s/ /\\n/'

如果你想处理可能有多个space连续的情况,你可以这样做:

sed $'s/  */\\n/'   # that's space, space, asterisk

或者您可以使用扩展的正则表达式:

sed -E $'s/ +/\\n/' 

如果你想处理任意白色space(例如制表符和spaces),那么你可以用[[:space:]]替换上面的文字space字符.

或者,您可以使用没有版本不兼容性的 Perl:

perl -pe 's/\s+/\n/'

其实

sed -e 's/\s/\n/' output.txt > new.txt

应该够了。如果删除全局标志,它将匹配第一个字符,并且 sed 按行工作。