查找具有确切字符数的单词

时间:2016-05-09 19:31:42

标签: regex bash awk sed

我有数百行像

1234 dfsdfdsfa INIUUININI112123424124 12321 JH7897IUHIH879KJ

并且从每一行开始,我只希望获得只包含9个字符的单词(示例中为dfsdfdsfa)。我怎么能这样做?

我尝试了很多regexs / sed / grep / awk但没有成功。

4 个答案:

答案 0 :(得分:1)

使用grep:

$ grep -oE '\b.{9}\b' infile
dfsdfdsfa

-o仅返回匹配项而不返回完整行; -E是因为我很懒,不想逃避{}(如\{\})。

正则表达式本身是“字边界之间的任何9个字符”。这不是万无一失的,也会匹配abcd efgh,这可以通过指示我们只需要非空白字符来避免:

 grep -oE '\b[^[:blank:]]{9}\b' infile

我们可以使用\b...\b选项来确保使用-w,而不是使用<nav class="exodus-nav-left-right exodus-content-block exodus-content-block-compact exodus-clearfix">

答案 1 :(得分:0)

这是一个纯粹的bash解决方案:

filename="test.txt"
declare -a record
while read -ra record
do
    for field in ${record[@]} 
    do
        if (( ${#field} == 9 ))
        then
            echo $field
        fi
    done
done < "$filename"

这是awk中嵌入的bash解决方案:

filename='test.txt'
awk -f - "$filename" << '_END_'
{
    for (i=1; i < NF; i++) {
        if (length($i) == 9) print $i
    }
}
_END_

答案 2 :(得分:0)

cat foo.txt  | sed -e 's/[\t ]/\n/g' | awk '/^.{9}$/

也应该做到这一点。

答案 3 :(得分:0)

带有grep-w)选项的

--word-regexp

grep -wo '.\{9\}' file.txt

请注意,单词构成字符为:

[[:alnum:]_]

示例:

% grep -wo '.\{9\}' <<<'1234 dfsdfdsfa INIUUININI112123424124 12321 JH7897IUHIH879KJ'
dfsdfdsfa