过滤以连字符开头和结尾的单词,但不能在中间找到它

时间:2014-03-20 12:18:33

标签: regex bash grep

我有一个我要过滤的单词列表:只有那些以连字符开头或结尾的单词,而不是那些在中间带有连字符的单词。也就是说,过滤条目如:“a-”或“-cefalia”而不是“castellano-manchego”。

我尝试了很多选项和最相似的东西,我发现它是grep -E '*\-' minilemario.txt但是它会过滤所有连字符。你能帮我解决一下吗?

    a
    a-
    aarónico
    aaronita
    amuzgo
    an-
    -án
    ana
    -ana
    ana-
    anabaptismo
    anabaptista
    blablá
    bla-bla-bla
    blanca
    castellano
    castellanohablante
    castellano-leonés
    castellano-manchego
    castellanoparlante
    cedulario
    cedulón
    -céfala
    cefalalgia
    cefalálgico
    cefalea
    -cefalia
    cefálica
    cefálico
    cefalitis
    céfalo
    -céfalo
    cefalópodo
    cefalorraquídeo
    cefalotórax
    cefea
    ciabogar
    cian
    cian-
    cianato
    cianea
    cianhídrico
    cianí
    ciánico
    cianita
    ciano-
    cianógeno
    cianosis
    cianótico
    cianuro
    ciar
    ciática
    ciático
    zoo
    zoo-
    zoófago

2 个答案:

答案 0 :(得分:4)

使用grep,说:

grep -E '^-|-$' filename

获取以-开头和结尾的单词。和

grep -v -E '^-|-$' filename

排除以-开头和结尾的字词。

^$分别表示行的起点和终点。您使用'*\-'来匹配-之后的任何内容(它不会说-位于该行的末尾)。

答案 1 :(得分:0)

这是一个仅限bash的解决方案。请参阅评论了解详情:

#!/usr/bin/env bash

# Assign the first argument (e.g. a textfile) to a variable
input="$1"

# Bash 4 - read the data line by line into an array
readarray -t data < "$input"

# Bash 3 - read the data line by line into an array
#while read line; do
#    data+=("$line")
#done < "$input"

# For each item in the array do something
for item in "${data[@]}"; do

    # Line starts with "-" or ends with "-"
    [[ "$item" =~ ^-|-$ ]] && echo "$item"

done

这将产生以下输出:

$ ./script input.txt
a-
an-
-án
-ana
ana-
-céfala
-cefalia
-céfalo
cian-
ciano-
zoo-