【发布时间】:2017-08-09 20:19:46
【问题描述】:
我有一个文件记录了几个目录的结构。我正在尝试单独打印每个目录的文本。我的输入文件如下所示:
$ cat file.txt
/bin:
file_1
file_2
file_3
/sbin:
file_a
file_b
file_c
/usr/local/bin:
doc_a
doc_b
doc_c
我要做的是根据用户选择打印文件的特定部分:
#!/bin/bash
PS3=$'\nMake a selection '
select dir in $(grep ':' file.txt;) do
case $REPLY in
[0-9]) echo $dir
# Need something here. Maybe a pcregrep regex?
# pcregrep '(<= $dir)*(some_fancy_regex)' file.txt
break;;
esac
done
向用户显示菜单选项:
1) /bin:
2) /sbin:
3) /usr/local/bin:
Make a selection
假设用户选择 2。目前,这只是在屏幕上打印所选目录。我想显示目录以及它包含的文件。
/sbin:
file_a
file_b
file_c
根据我的阅读,pcre 正则表达式似乎可以在这里工作。我几乎不了解非 pcre 风格的正则表达式。我试图让我的大脑围绕积极和消极的前瞻和后视,但我真的不知道我在做什么。如果有人可以帮助我解决这个问题,我将不胜感激。
- 所有目录都以
/开头并以:结尾 - 每个目录下列出的文件名可能包含:
-
[a-z],[A-Z],[0-9] - 文字字符
._-[
-
- 所有目录/文件结构都以空行结束
【问题讨论】:
-
这个问题有很多非常好的答案。很难说是哪一个“解决”了问题,因为在这一点上,所有的答案都做到了。
-
只有one of them 不涉及shell 循环,所以why-is-using-a-shell-loop-to-process-text-considered-bad-practice 可能会有所帮助。同样,这也是唯一适用于输入文件的所有内容的,并且可以在所有 UNIX 系统上的所有 bourne 派生的 shell 之间移植。其他的只能在特定的 shell 中工作和/或当您的输入包含正则表达式元字符或转义字符或....时会失败。
标签: regex bash macos grep pcre