你可以传递grep()一个模式向量吗?

时间:2015-06-18 22:56:15

标签: regex r grep

ls *.mp3 | sort -rn | while read f
do 
    number=`echo "$f" | sed 's/ .*//'`
    rest=`echo "$f" | sed 's/^[^ ]* //'`

    number2=`expr $number + 1`
    number2f=`printf %02d $number2`

    mv -i "$number $rest" "$number2f $rest"
done

有效?

2 个答案:

答案 0 :(得分:2)

我们可以用一个例子来说明。以下是按地区划分的一些州名缩写。

south <- c('FL', 'TN', 'LA', 'GA')
west <- c('CA', 'NV', 'WA', 'AZ')

让我们来看看南部各州的A&#39;或者&#39; L&#39;在他们的缩写。

y1 <- 'A'
y2 <- 'L'

我们可以将它们写入grep函数并用管道符|分隔。或者我们可以练习使用变量名称。如果连接变量,我们将无法获得正确的输出。

grep('A|L', south, value=TRUE)
[1] "FL" "LA" "GA"

grep(paste(y1, y2, sep='|'), south, value=TRUE)
[1] "FL" "LA" "GA"

grep(c(y1, y2), south, value=TRUE)
[1] "LA" "GA"
Warning message:
In grep(c(y1, y2), south, value = TRUE) :
  argument 'pattern' has length > 1 and only the first element will be used

但还有更多。如果我们想找到拥有'L'的南部州和拥有'A'的西部州,该怎么办?我们必须编写两个函数,对吧?

mapply(grep, list(y2, y1), list(south, west), value=TRUE)
[[1]]
[1] "FL" "LA"

[[2]]
[1] "CA" "WA" "AZ"

所有这一切都是一步完成的。

答案 1 :(得分:0)

不,你不能。但是你总是可以使用Vectorize快速地向量化一个函数(但有时性能不是那么好)。

没有矢量化:

grep(list("x1", "x2"), list("x1","x2")) # does not work
[1] 1
Warning message:
In grep(list("x1", "x2"), list("x1", "x2")) :
  argument 'pattern' has length > 1 and only the first element will be used

向量化:

Vectorize(grep)(list("x1", "x2"), list("x1","x2")) # it works
[1] 1 1

或者,如果您愿意,您只能向量化特定参数:

Vectorize(grep, "pattern" )(c("a","b","c"),c("aa","bb","cc","aa2"))
$a
[1] 1 4

$b
[1] 2

$c
[1] 3

如果您打算使用矢量化版本,也许您应该将它们分配给其他功能:

vgrep <- Vectorize(grep)
vgrep(list("x1", "x2"), list("x1","x2"))
[1] 1 1