每行打印前三个单词的sed脚本

8
我想知道如何使用sed实现以下操作: 我需要保留每行中的前三个单词。 例如,下面的文本:
the quick brown fox jumps over the lazy bear
the blue lion is hungry

将被转换为:

the quick brown
the blue lion

1
注意:当我添加问题时,我忘记了“cut”,这是正确的工具来完成任务:cut -f-3 -d" "。 - BearCode
8个回答

18
在awk中你可以这样写:
{print $1, $2, $3}

太棒了,我正在寻找一种方法来从运行ec2实例的命令中剥离出第一个单词,一直在尝试使用sed和cut,但awk正好符合我的要求。 - Shawn Vader
1
谢谢您的回复,但是有点不太清楚,所以我会添加 awk -vORS=' ' '{print $1}'(这里我使用 -vORS=' ' 是因为我想要单词之间用空格分隔)。 - Sverre
高尔夫编程: awk '{NF=3}1' - George Vasiliou

15

您可以像这样使用cut:

cut -d' ' -f1-3

谢谢。事实上,我应该意识到这是“cut”的任务,而不是“sed”。cut -f -3 inputfile。 - BearCode
2
请注意,-f-3 等同于 -f1-3。也就是说,-3 的意思是:所有字段直到 3 - fedorqui
1
我不知道,谢谢。虽然为了清晰和因为我会忘记缩写,我怀疑我会继续写“-f1-3”。 - Ed Morton

6
我建议在这种情况下使用awk
awk '{print $1,$2,$3}' ./infile

4
% (echo "A B C D E F G H";echo "a b c d e f g h") | sed -E 's/([^\s].){3}//'

我在这里加上了“-E”以适应OS X的兼容性。其他Unix系统可能需要或不需要。

编辑:该死 - 脑抽了。使用以下内容:

% sed -E 's/(([^ ]+ ){3}).*/\1/' <<END
the quick brown fox jumps over the lazy bear
the blue lion is hungry
END

the quick brown 
the blue lion 

使用 sed 可以得到更简洁的解决方案,但您可能需要编辑您的帖子以删除第一次尝试。 - thkala

2

仅使用Shell

while read -r a b c d
do
  echo $a $b $c
done < file

Ruby(1.9)+

ruby -ane 'print "#{$F[0]} #{$F[1]} #{$F[2]}\n"' file

“'puts $F[0..2].join " "'” 对于 Ruby 来说更加简洁。 - glenn jackman

1
如果您需要一个sed脚本,可以尝试以下内容:
echo "the quick brown fox jumps over the lazy bear" | sed 's/^\([a-zA-Z]\+\ [a-zA-Z]\+\ [a-zA-Z]\+\).*/\1/'

但我认为使用cut会更容易:

echo "the quick brown fox jumps over the lazy bear" | cut -d' ' -f1,2,3

Cut命令无法处理使用不同空格的变化。 - cbz
另外,sed 命令中包含一个字面上的空格也没有问题(顺便说一下,这个空格不需要转义)。 - Dennis Williamson

1
这是一个与 `sed` 相关的丑陋代码块:
$ echo the quick brown fox jumps over the lazy bear | sed 's|^\(\([^[:space:]]\+[[:space:]]\+\)\{2\}[^[:space:]]\+\).*|\1|'
the quick brown

0
如果Perl是一个选项: < p > < code > perl -lane 'print "$F[0] $F[1] $F[2]"' file

< code > perl -lane 'print join " ", @F [0..2]' file


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接