为什么这个不起作用?

时间:2017-02-04 02:42:55

标签: bash 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不起作用一样。为什么会这样?

4 个答案:

答案 0 :(得分:1)

使用正确的工具:

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

答案 1 :(得分:0)

我认为sed并不认识+作为1或更多的元字符。你可以试试这个。

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

答案 2 :(得分:0)

这里

[A-Z][a-z]\+

是A-Z之一,其次是a-z"中的一个或多个。您的意思可能是[A-Za-z],甚至更好,并且不易受区域变体[[:alpha:]]的影响。

我只想提取每行的最后一个单词:

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

无需单独的catsort | uniqsort -u相同。

答案 3 :(得分:0)

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

这似乎有效。由于我在Windows上,因此我必须使用\s而不是[[:space:]]。但即使我只是改变空间并尝试:

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

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