sed:在 [6 位数字] 和 space 之后换行

sed: newline after a[6 digits] and space

我正在尝试将 [6 位数字] 之后的 space 替换为换行符,我曾尝试使用

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

例如:

a123456 this is a sentence

会变成:

a123456
this is a sentence

我也愿意接受 linux 中允许我执行此操作的任何其他程序,例如 awk、perl 或 bash。

首先,我建议在此处使用 POSIX 扩展正则表达式和 sed -r 来简化模式。


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

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

请注意,我将 space 之前的所有内容都捕获到捕获组中,并在替换模式中使用此组 </code>。</p> <p>然而,在 POSIX 正则表达式中确实有可用的命名字符 类,但它们的输入时间比在 Perl 中长。如果你想使用命名字符类,你可以使用:</p> <pre><code>sed -r 's/(a[[:digit:]]{6})[[:space:]]+/\n/' old > new

在这种情况下。如果您想了解更多关于 POSIX 正则表达式中可用字符 类 的信息,请查看 grep and/or egrep.

的联机帮助页

您可以使用:

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

在 BSD 上使用 sed (OSX):

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

perl:

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

使用回溯,用换行符替换空格。