sed:用换行替换第一次出现的空格

时间:2015-03-26 18:45:22

标签: regex linux file sed

我正在尝试用换行符替换每行中第一个出现的空格。

例如

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。

5 个答案:

答案 0 :(得分:3)

您可以使用:

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

这同样适用于BSD以及gnu sed。

答案 1 :(得分:2)

不要将正则表达式固定在行的开头并抛弃g标志:

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

编辑:由于疼痛,BSD因部分被移除。

答案 2 :(得分:0)

你可以用这个:

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

它用记录选择器更改第一个字段分隔符。

答案 3 :(得分:0)

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

首先,如果你确定它只是一个空格,你可以这样做:

sed $'s/ /\\\n/'

如果您想处理行中可能有多个空格的情况,您可以这样做:

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

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

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

如果要处理任意空格(例如制表符和空格),则可以使用[[:space:]]替换上面的文字空格字符。

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

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

答案 4 :(得分:0)

实际上

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

应该足够了。如果删除全局标志,它将匹配第一个char和sed按行工作。