如何使用命令 sed 在 bash 中显示具有一定数量单词的行
How to show line with certain number of words with command sed in bash
例如我有这样的文件:
Hel@@lo hi 123
if a equals b
you
two three four
dany uri four 123
1 2 3333333
我需要命令只打印其中包含 3 个单词的行。
我试图在 sed
中编写命令,但不知何故它无法识别行尾的字符 $
。
sed '/.\+[ ]\+.\+[ ]\+[^ ]\+$/!d'
使用awk
:
awk 'NF==3' file.txt
$ cat file.txt
Hel@@lo hi 123
if a equals b
you
two three four
dany uri four 123
1 2 3333333
$ awk 'NF==3' file.txt
Hel@@lo hi 123
two three four
1 2 3333333
对您的原始代码进行少量修改:
$ sed '/^[^ ]\+[ ]\+[^ ]\+[ ]\+[^ ]\+$/!d' file.txt
Hel@@lo hi 123
two three four
1 2 3333333
以上将制表符视为单词字符,而不是白色space。它还假定不会有前导或尾随白色space。
使用 sed
,但允许任何类型的白色 space 并忽略一行上的前导和尾随白色 space:
$ sed -nr '/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+[[:space:]]+[^[:space:]@]+[[:space:]]*$/p' file.txt
Hel@@lo hi 123
two three four
1 2 3333333
如果使用 Mac OSX 或其他 BSD 平台,请将 -r
替换为 -E
,如下所示:
sed -nE '/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+[[:space:]]+[^[:space:]@]+[[:space:]]*$/p' file.txt
例如我有这样的文件:
Hel@@lo hi 123
if a equals b
you
two three four
dany uri four 123
1 2 3333333
我需要命令只打印其中包含 3 个单词的行。
我试图在 sed
中编写命令,但不知何故它无法识别行尾的字符 $
。
sed '/.\+[ ]\+.\+[ ]\+[^ ]\+$/!d'
使用awk
:
awk 'NF==3' file.txt
$ cat file.txt
Hel@@lo hi 123
if a equals b
you
two three four
dany uri four 123
1 2 3333333
$ awk 'NF==3' file.txt
Hel@@lo hi 123
two three four
1 2 3333333
对您的原始代码进行少量修改:
$ sed '/^[^ ]\+[ ]\+[^ ]\+[ ]\+[^ ]\+$/!d' file.txt
Hel@@lo hi 123
two three four
1 2 3333333
以上将制表符视为单词字符,而不是白色space。它还假定不会有前导或尾随白色space。
使用 sed
,但允许任何类型的白色 space 并忽略一行上的前导和尾随白色 space:
$ sed -nr '/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+[[:space:]]+[^[:space:]@]+[[:space:]]*$/p' file.txt
Hel@@lo hi 123
two three four
1 2 3333333
如果使用 Mac OSX 或其他 BSD 平台,请将 -r
替换为 -E
,如下所示:
sed -nE '/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+[[:space:]]+[^[:space:]@]+[[:space:]]*$/p' file.txt