如何使用sed对带有空格的字符串进行分组?

时间:2014-02-06 01:50:37

标签: regex shell sed sh backreference

假设我的文本文件包含以下字符串:

Apple foo foobar
Banana foo foobar1 abc b c
Orange barfoo
Pear foo

如何对AppleBananaOrangePear之后的字符串进行分组?

我可以为Apple执行此操作,但这不适用于其他文本文件。

sed 's/\([^ ]*\) \([^ ]*\) \([^ ]*\)/\2 \3/'

我希望输出看起来像这样:

foo foobar
foo foobar1 abc b c
barfoo
foo

是否有一般情况我可以在第一个空格后打印这些字符串?

5 个答案:

答案 0 :(得分:3)

sed -r 's/^[^ ]+[ ]+//' in.txt

(GNU sed;在OSX上,使用-E代替-r)。


<强>更新

正如@Jotne指出的那样,在这种情况下并不严格需要初始^ - 尽管它使意图更清晰;同样,您可以将[]放在第二个空格字符周围。

上面只讨论分隔列的空格(可能有多个,感谢正则表达式中的最终+),而OP通常提到空白

广义空白版

注意:在下面的表单中,\s[:space:]匹配所有类型的空白,包括换行符。如果您想限制与空格和标签的匹配,请使用[ \t][:blank:]

sed -r 's/^\S+\s+//' in.txt

(GNU sed;这个表单将在OSX上工作,即使使用-E。)

POSIX兼容版(例如,对于AIX - 谢谢,@ NeronLeVelu):

sed  's/^[^[:space:]]\{1,\}[[:space:]]\{1,\}//' in.txt

答案 1 :(得分:1)

任何原因都必须是sed?

$ cat <<EOF | cut -d ' ' -f 2-
Apple foo foobar
Banana foo foobar1 abc b c
Orange barfoo
Pear foo
EOF

foo foobar
foo foobar1 abc b c
barfoo
foo

答案 2 :(得分:1)

GNU grep也适用

grep -oP '(?<=\s).*'

答案 3 :(得分:0)

对sed不确定。

但您可以使用多线修改器删除每行的不需要的部分

/^\w+\s/gm

答案 4 :(得分:0)

这也可以通过awk

解决
awk '{$1="";sub(/^ /,x)}1' file
foo foobar
foo foobar1 abc b c
barfoo
foo

或与此:

awk '{sub(/[^ ]+ /,x)}1' file