从管道输出中删除空格

时间:2018-04-28 20:01:01

标签: bash grep zsh

在文本文件中,我有一些带有符号:foo的标签。要在文件中概述我的标签,我想获得所有这些标签的列表。

这是通过

完成的
grep -o -e ":[a-z]*\( \|$\)" file.txt | sort |  uniq

现在我得到重复,因为最后是空格或换行符。

:movie  <-- only newline
:movie  <-- whitespace and newline
:read
:read 

我想避免重复。但我无法弄清楚如何。我尝试使用| tr -d '[:space:]',但这只会导致所有管道输出的串联......

file.txt

的示例
Avengers: Infinity War :movie
Yojimbo 1961 :movie nippon

4 个答案:

答案 0 :(得分:2)

某些测试行(第一个:space后面有一个空格,如果用鼠标突出显示数据,则可以看到它):

$ cat file
with :space 
with :space too
without :space
test: this

使用grepsortuniq

$ grep -o ":[a-z]\+" file | sort | uniq 
:space

使用awk(至少是gawk和mawk):

$ awk 'BEGIN{RS="[" FS "|" RS "]+"}/:[a-z]/&&!a[$0]++' file
:space

每个单词都是自己的记录,我们选择每个冒号起始单词的第一个实例。 RS="[" FS "|" RS "]+"可以用其他方式编写,但它采用这种形式强调FSRS的任意组合。

答案 1 :(得分:1)

您可以使用Perl正则表达式和单词匹配:

grep -oP ':\w+' file.txt | sort |  uniq

或者,只匹配非空格字符:

grep -o ':[^ ]*' file.txt | sort |  uniq

答案 2 :(得分:0)

由于您还没有提供示例Input_file,因此无法对其进行测试,因为我没有和我一起使用zsh。请尝试以下操作并告诉我这是否对您有所帮助。

awk '/:[a-z]*/{sub(/ +$/,"");} !a[$0]++' Input_file | sort

答案 3 :(得分:0)

您可以尝试使用sed

sed 's/.*\(:[a-z]*\).*/\1/' file.txt | sort | uniq