如何打印与正则表达式匹配的linux文件名部分

时间:2018-06-05 15:03:09

标签: regex linux string awk

我想列出linux目录中的所有文件,然后对它们应用正则表达式来格式化文件名,并打印这些格式化的文件名。

示例:

ls -lthrh
.
.

-rwxrwxrwx. 1 root   root  633 Oct 31  2016 Oracle_Schedule_ARC-Oracle_ARCH-1477938600005-1002-Oracleorcl-rman1.txt

-rwxrwxrwx. 1 root   root  610 Nov  7  2016 MOD-1478512353102-1002-Oracleorcl-rman1.txt

After applying my regex '.+?(?=-)' I would have everything before the first '-' to be:

Oracle_Schedule_ARC
MOD

我尝试过使用awk,但我无法通过正则表达式。我稍后会申请排序| uniq具有正则表达式输出的唯一输出。

1 个答案:

答案 0 :(得分:1)

在任何POSIX外壳中{bashpdkshksh93zshdash):

for name in *; do
    printf '%s\n' "${name%%-*}"
done

这将遍历当前目录中的所有名称,并在第一个-字符之前输出该位。它通过使用标准参数替换从文件名中删除与-*匹配的最长后缀字符串来完成此操作。

请注意-*是一个shell globbing模式,而不是正则表达式。正则表达式对于处理文本很有用,但是通常使用通配符模式来快速有效地处理文件名和路径名,因为您不必使用正则表达式引擎启动另一个进程,例如awk或{{ 1}}。

sed中,你也可以完全不使用循环:

bash

首先将位置参数设置为当前目录中的名称。然后在名称集上调用set -- * printf '%s\n' "${@%%-*}" ,每个名称都使用与本答案第一部分相同的参数替换进行单独转换。

同样的事情,但使用除位置参数数组之外的数组变量:

printf