仅排除txt文件的四位数和五位数

时间:2017-10-24 20:24:00

标签: bash shell vi

我在linux bash中有一个文件,基本上我有一个文件名列表。

文件名包括所有类型的字符A-Z a-Z。 _和数字。

示例:
HELLO-34.87-世界
foo-的 34578 -bar
fo.23-的 5789 -foobar
还有更多...

目标是,我只列出四个五个个数字。

所以结果应该是:
34578
5789

我认为与vi合作是个好主意。

所以我只能使用一个命令:

:%S / someregularexpression //克

感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

无需将文件名存储在文件中

$ shopt -s extglob nullglob
$ for file in *-[0-9][0-9][0-9][0-9]?([0-9])-*; do 
    tmp=${file#*-}             # remove up to the first hyphen
    tmp=${tmp%-*}              # remove the last hyphen and after
    echo $tmp
done
5789
34578

答案 1 :(得分:0)

只需使用sed sed -nr 's/^[^0-9]*([0-9]{4,5}).*/\1/p' < myfile.txt

答案 2 :(得分:0)

这适用于每行1个实例,并由1对短划线包围

    grep -P '\d{4,5}' mytxt | \
    while read buff
    do
        buff=${buff#*-}
        echo ${buff%-*}
    done

答案 3 :(得分:0)

如果您使用vim,并且每行的行数不超过一个,您可以尝试以下操作:

:%s/^.\{-}\(\d\{4,5\}\).\{-}$/\1/g 

请参阅:help \{-进行非贪婪搜索。

答案 4 :(得分:0)

通常,您不希望在空格,换行符和其他特殊字符的情况下解析ls。在这种情况下,你不在乎 首先将所有非数字事物替换为换行符。 而不只是寻找4或5位数的行。更换后你只有数字,所以这可以通过查找4或5个字符来完成。

ls | tr -c '[^0-9]' '\n' | grep -E "^....(|.)$" 

如果文件中已有文件名而且您在vi,请使用

:% !tr -c '[^0-9]' '\n' | grep -E "^....(|.)$"