awk 或 sed 从目录路径解析元素

awk 或 sed 从目录路径解析元素

假设我有几个不同长度的目录

/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.

里面的正则表达式分为三个组成部分:

  1. ^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/

文件名必须^/tmp/then 开头,必须有一些非空格字符,后跟一个空格,后跟(捕获此)非空格字符,然后是正斜杠之前的任何内容

  1. ([^[:space:]]*).*/

...后面跟着(捕获这个)非空格字符,然后是正斜杠之前的任何内容

  1. ([^[: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命令做了三件事:

  1. 用点替换从点到下一个斜杠的所有内容,创建

    /tmp/(1) I./01./a.
    /tmp/(2) II./03./d.
    
  2. 删除直到第一个空格为止的位,

    I./01./a.
    II./03./d.
    
  3. 删除斜杠,

    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.

相关内容