为什么这个 sed 不起作用



我有一个文本文件名coalitions.txt,它看起来像这样:

Hadash left
Balad left
Raam_Taal left
Meretz left
Shas right
Habait_Hayehudi right
Haihud_Haleumi right
Yehadut_Hatorah right
Liberman right
Avoda left
Kadima center
Likud right

我想打印每行中最后一个单词的列表,没有重复项。输出应为:

left
right
center

我知道我可以使用许多技术,例如tail但我想知道为什么我所做的不起作用......我试过这个:

cat coalitions.txt | sed 's/.*[[:space:]]+([A-Z][a-z]+)/1/' | sort | uniq

但它只是再次打印相同的列表,就好像我的sed不起作用一样。为什么会这样?

使用正确的工具完成工作:

$ awk '!z[$NF]++ {print $NF}' coalitions.txt
left
right
center

这里

[A-Z][a-z]+
是"A-Z

中的一个,后跟一个或多个 A-Z"。你的意思可能是[A-Za-z],甚至更好,不容易受到区域设置变化的影响,[[:alpha:]]

我只会像这样提取每行的最后一个单词:

sed 's/.*[[:space:]]([^[:space:]]*)$/1/' coalitions.txt | sort -u

不需要单独的catsort | uniqsort -u一样。

我认为 sed 无法将 + 识别为 1 个或多个元字符。 你可以试试这个。

cat coalitions.txt | sed 's/.* ([A-Za-z][A-Za-z]*)/1/' | sort | uniq
cat coalitions.txt | sed 's/.*s+([A-Za-z]+)/1/'

这似乎奏效了。 由于我在窗户上,我必须使用s而不是[[:space:]]。 但即使我只是更改空间并尝试:

cat coalitions.txt | sed 's/.*s+([A-Z][a-z]+)/1/'

它不起作用。 问题是字符范围必须使用逗号而不是单独的括号。 [A-Za-z]

最新更新