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 按行工作。
我正在尝试用换行符替换每行中 第一次 出现的 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 按行工作。