用SED替换KSH中的空格

时间:2012-08-30 21:14:32

标签: 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')

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

3 个答案:

答案 0 :(得分:1)

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

另请注意,find -predicate -predicate ....默认为AND。要使-o工作,你必须在( (parens) )中完成整个事情,所以shell不会将paren视为启动子shell的请求,你必须逃避parens,即{ {1}}。所以这导致我们

\( .... -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

表示我的发现不支持-level。

修改删除了+ 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' 周围的额外"个字符。

同时

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

\(....\)

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

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

-name

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

IHTH

答案 1 :(得分:1)

ksh:

FILES='*.txt *.html'
FILE_NAMES=$(
  # $() runs this script in a subshell
  conjunction=""
  set -f   # turn off file pattern expansion
  for patt in $FILES; do
    printf "%s -name '%s' " "$conjunction" "$patt"
    conjunction="-o"
  done
)
find  "${SRC_DIR}" ${FILE_NAMES} -type f -mtime +14 -level 0

请注意,$FILE_NAMES 未引用 - 您希望shell将变量拆分为单独的单词。

答案 2 :(得分:0)

采用不同的方法可能更容易:

find ${SRC_DIR} -type f -mtime +14 | egrep '\.(txt|html)$'

我遗漏了-level 0位因为我不知道它是什么 - 它在我手边的版本中不存在。你总是可以把它放回去......