我有数百行像
1234 dfsdfdsfa INIUUININI112123424124 12321 JH7897IUHIH879KJ
并且从每一行开始,我只希望获得只包含9个字符的单词(示例中为dfsdfdsfa
)。我怎么能这样做?
我尝试了很多regexs / sed / grep / awk但没有成功。
答案 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