sed:[6位]和空格后的换行符

时间:2015-03-27 14:06:47

标签: regex linux file sed

我试图用[6位数]后面的空格替换我尝试过的换行符

sed 's/a\d{6}\s\+/\n/' old > new

例如:

a123456 this is a sentence

会变成:

a123456
this is a sentence

我也对linux中允许我这样做的其他程序开放,例如awk,perl或bash。

3 个答案:

答案 0 :(得分:1)

首先,我建议在这里使用带有sed -r的POSIX扩展正则表达式来简化模式。


POSIX正则表达式甚至POSIX扩展正则表达式(-r)不支持\d\s作为字符类,例如Perl。我会使用以下模式:

sed -r 's/(a[0-9]{6}) +/\1\n/' old > new

请注意,我正在将空间之前的所有内容捕获到捕获组中,并在替换模式中使用此组\1

但是,确实在POSIX正则表达式中可以使用命名的字符类,但它们的输入时间比在Perl中更长。如果要使用命名字符类,可以使用:

sed -r 's/(a[[:digit:]]{6})[[:space:]]+/\1\n/' old > new

在这种情况下。如果您想了解有关POSIX正则表达式中可用字符类的更多信息,请查看grep和/或egrep的联机帮助页。

答案 1 :(得分:1)

您可以使用:

s='a123456 this is a sentence'
sed -r $'s/\<(a[[:digit:]]{6})[[:blank:]]+/\\1\\\n/' <<< "$s"
a123456
this is a sentence

关于BSD sed use(OSX):

sed -E $'s/[[:<:]](a[[:digit:]]{6})[[:blank:]]+/\\1\\\n/' <<< "$s"

答案 2 :(得分:0)

perl的:

perl -pe 's/(?<=a\d{6})\s+/\n/'

使用look-behind,用换行符替换空格。