unix - 将 KSH 中的空格替换为 SED

标签 unix sed ksh

我正在以编程方式构建一个 find 命令:

find  "${SRC_DIR}" "${FILE_NAMES}" -type f -mtime +14 -level 0

其中 FILE_NAMES 是我需要匹配的文件模式,它是一个简单的空格分隔的模式列表(*.txt、*.html 等)。

要为 find 命令正确设置此列表的格式,它不能只是一个列表,它必须看起来像:

-name *.txt -o -name *.html

我的解决方案是使用:

FILE_NAMES=$(echo ${FILES} | sed -e 's/\s+/-o -name /g')

但它不起作用,特别是它似乎不明白我想要替换空格。有没有人有更好的方法来做到这一点?

最佳答案

并非所有 sed 都支持类似 perl 的空格、数字等占位符。我没有办法测试您的确切情况,但以下内容应该是一个很好的指南。

另请注意,find -predicate -predicate .... 默认情况下是 AND 运算。要使 -o 工作,您必须将整个内容放在 ( (parens) ) 中,这样 shell 就不会将 paren 视为启动subshel​​l 中,您必须转义括号,即 \( .... -o ....\)。所以这导致我们

 set -vx; SRC_DIR="." ; FILE_NAMES="a b c"
 find  "${SRC_DIR}" \( $(echo "$FILE_NAMES"| sed 's/ / -o -name /g;s/^/-name /') \) -type f -mtime +14 -level 0

输出

+ echo 'a b c'
+ sed 's/ / -o -name /g;s/^/-name /'
+ find . '\( -name a -o -name b  -o -name c \)' -type f -mtime +14 -level 0
find: invalid predicate `-level'

这只是表明我的发现也不支持 -level。

编辑删除了 \(....\) 周围的额外 " 字符。

还有

如果您使用的是 ksh93,也许可以使用变量修饰符,例如

${FILE_NAME// / -o -name}

但是您需要连接开头的 -name 或对 FILE_NAME 的保存值进行第二次替换。

您可以通过发出以下命令来查看是否有 ksh93

echo ${.sh.version}

如果你得到一个值,那么你就有了 ksh93。

IHTH

关于unix - 将 KSH 中的空格替换为 SED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205640/

相关文章:

unix - OpenBSD 中的进程信息

linux - 从工作角度学习哪个 Unix Distribution 更好

c - 在 fork() 调用期间如何共享用户程序和数据以及为什么子进程在 fork() 调用之前运行完成?

linux - 当/dev/null 也给出 "permission denied"时消除 'permission denied'

bash - 重命名大量文件的扩展 Bash

regex - sed 命令删除文本,直到为 csv 的每一行找到匹配项

linux - 将输出同时重定向到控制台和文件的命令在 bash 中运行良好。但我如何让它在 korn shell(ksh) 中工作

perl - 替换换行符和后面的空格,直到文件中的特定字符串

bash - bash 与 ksh 中的变量重定向

algorithm - KornShell (ksh) 调度算法 (SRT)