假设我的文本文件包含以下字符串:
Apple foo foobar
Banana foo foobar1 abc b c
Orange barfoo
Pear foo
如何对Apple
,Banana
,Orange
和Pear
之后的字符串进行分组?
我可以为Apple
执行此操作,但这不适用于其他文本文件。
sed 's/\([^ ]*\) \([^ ]*\) \([^ ]*\)/\2 \3/'
我希望输出看起来像这样:
foo foobar
foo foobar1 abc b c
barfoo
foo
是否有一般情况我可以在第一个空格后打印这些字符串?
答案 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