假设我有几个不同长度的目录
/tmp/(1) I. First Majuscule Roman Numeral/01. First Arabic Numeral/a. First Grapheme
/tmp/(2) II. Second Majuscule/03. Third Arabic/d. Fourth
我想解析,所以输出是
I.01.a.
II.03.d.
awk 和/或 sed 解决方案是什么?
答案1
确实不需要 awk 或 sed; bash 通配符和正则表达式测试可以做到这一点:
for d in /tmp/*/*/*
do
if [[ $d =~ ^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/([^[:space:]]*).*/([^[:space:]]*) ]]
then
printf "%s\n" "${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
fi
done
示例输出:
I.01.a.
II.03.d.
里面的正则表达式分为三个组成部分:
^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/
文件名必须^
以/tmp/
then 开头,必须有一些非空格字符,后跟一个空格,后跟(捕获此)非空格字符,然后是正斜杠之前的任何内容
([^[:space:]]*).*/
...后面跟着(捕获这个)非空格字符,然后是正斜杠之前的任何内容
([^[:space:]]*)
...后面跟着(捕获这个)非空格字符)--后面跟着...我们不关心什么。
Bash 根据捕获括号的顺序将这些捕获的位保存到 BASH_REMATCH 数组中。
答案2
假设这些是仅有的下面的目录/tmp
:
$ find /tmp -mindepth 3 -type d -print | sed -e 's/\.[^/]*/./g' -e 's/^.* //' -e 's#/##g'
I.01.a.
II.03.d.
该find
命令查找第 3 层目录并打印出它们的完整路径。这一步的结果是
/tmp/(1) I. First Majuscule Roman Numeral/01. First Arabic Numeral/a. First Grapheme
/tmp/(2) II. Second Majuscule/03. Third Arabic/d. Fourth
该sed
命令做了三件事:
用点替换从点到下一个斜杠的所有内容,创建
/tmp/(1) I./01./a. /tmp/(2) II./03./d.
删除直到第一个空格为止的位,
I./01./a. II./03./d.
删除斜杠,
I.01.a. II.03.d.
答案3
哎呀,既然awk
还没有回复……
awk -v FS="" '
{
for (i=1;i<=NF;i++) {
if ($i==" " || $i=="/") {
part=""
} else if ($i==".") {
printf "%s.", part
} else {
part=part FS $i
}
}
}
END { printf "\n" }'
将字段分隔符设置为“”,以便它可以循环遍历每个字符。在当前字符中查找“”或“/”,如果找到则重置持有者(部分变量)。如果找到“.”打印出持有者,否则将当前字符连接到持有者上。完成后追加换行。
示例输出:
I.01.a.
II.03.d.