我想列出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具有正则表达式输出的唯一输出。
答案 0 :(得分:1)
在任何POSIX外壳中{bash
,pdksh
,ksh93
,zsh
,dash
):
for name in *; do
printf '%s\n' "${name%%-*}"
done
这将遍历当前目录中的所有名称,并在第一个-
字符之前输出该位。它通过使用标准参数替换从文件名中删除与-*
匹配的最长后缀字符串来完成此操作。
请注意-*
是一个shell globbing模式,而不是正则表达式。正则表达式对于处理文本很有用,但是通常使用通配符模式来快速有效地处理文件名和路径名,因为您不必使用正则表达式引擎启动另一个进程,例如awk
或{{ 1}}。
在sed
中,你也可以完全不使用循环:
bash
首先将位置参数设置为当前目录中的名称。然后在名称集上调用set -- *
printf '%s\n' "${@%%-*}"
,每个名称都使用与本答案第一部分相同的参数替换进行单独转换。
同样的事情,但使用除位置参数数组之外的数组变量:
printf