我正在尝试用换行符替换每行中第一个出现的空格。
例如
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。
答案 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按行工作。