我在linux bash中有一个文件,基本上我有一个文件名列表。
文件名包括所有类型的字符A-Z a-Z。 _和数字。
示例:
HELLO-34.87-世界
foo-的 34578 -bar
fo.23-的 5789 -foobar
还有更多...
目标是,我只列出四个和五个个数字。
所以结果应该是:
的 34578
5789
我认为与vi合作是个好主意。
所以我只能使用一个命令:
:%S / someregularexpression //克
感谢您的帮助。
答案 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 "^....(|.)$"