我有一个大文本,保存了大量文件路径及其信息
# just for demostration
/a/b/c/d/e
/a/b/c/d
/a/b/c
/a/b
/a
/b/c
/b
/c/d
/c
....
我只想显示那些具有特定数量的特定字符的内容,例如,
- 只有一个
/
- 不超过两个
/
这样我只提取根文件夹或仅提取到第一级子文件夹。
答案1
Awk
解决方案:
-- 只有一个/
:
awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }NF == sep' file
输出:
/a
/b
/c
-- 不超过两个/
:
awk -v sep=2 'BEGIN{ FS=OFS="/"; sep += 1 }NF <= sep' file
输出:
/a/b
/a
/b/c
/b
/c/d
/c
sep
- 多变的;代表目录分隔器的计数FS
和OFS
- 分别是字段分隔符和输出字段分隔符NF
- 代表字段总数
如果您需要将上述方法组合成一个awk
命令:
awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }(sep==2 && NF==sep) || (sep>2 && NF<=sep)' file
答案2
使用扩展的正则表达式:
grep -E '^([^/]*/[^/]*){1,2}$' input
导致这些匹配:
/a/b
/a
/b/c
/b
/c/d
/c
正则表达式语法表示:
^
- 锚定到行的开头( ... )
- 将以下位分组在一起[^/]*
- 任何非正斜杠字符,零个或多个/
- 正斜杠[^/]*
- 任何非正斜杠字符,零个或多个{1,2}
- 其中一组或两组$
- 锚定到线的末端