【问题标题】:Find words in the correct order [duplicate]以正确的顺序查找单词[重复]
【发布时间】:2012-04-30 19:32:00
【问题描述】:

我在 bash 中有一些工作要做。它是这样的:

作为第一个参数,您键入单词以按照写入的顺序在文件中找到它,在第二个参数中您键入目录。它必须递归搜索并返回它出现的文件名。

例如:bash mybash "alice cat" . 它应该返回包含例如:“alice has a cat”,“alice cat”,但不包含“cat has alice”的文件

我做了这样的事情

#!/bin/bash
pattern=".*"

for arg in $1; do
    pattern+="${arg}.*"
done

grep -r ${pattern} $2

但它只逐行搜索,没有找到具有以下内容的文件:

“爱丽丝别的东西”

"新行有猫"

但它应该返回它。

我们将不胜感激。

问候。

【问题讨论】:

  • 我不清楚为什么它应该返回“alice something else”而不是“cat has alice”?当“cat”不存在时,为什么要返回“alice something else”?
  • 如果你输入参数“alice cat”,它必须以相同的顺序在文件中,所以它不能返回“cat has alice”,因为“alice”在“cat”之前跨度>
  • 我明白,但包含“alice something else”的文件根本不包含“cat”。
  • 当我输入“alice something else”时,它是文件的第一行,第二行是“新行有一只猫”
  • 啊,那么是的,请参阅@frankc 中关于使用 grep 的多行正则表达式的相关 SO 问题。简而言之,你不能(使用 grep)。

标签: bash


【解决方案1】:

awk '/alice/,/cat/' file

做你想做的事?

【讨论】:

    【解决方案2】:

    如果您删除文件中的换行符,那么 grep 将按预期工作。

    find $2 -type f | while read file; do
      if tr '\n' ' ' < ${file} | grep -q -r ${pattern}; then
        echo ${file}
      fi
    done
    

    【讨论】:

    • 没用的猫是什么原因?
    • @jens tr 不接受文件名作为参数。
    • @Daenyth 如果您只是删除换行符,则可能会造成意外匹配。例如,frantic\nattack 将匹配 cat
    • @frankc 但是 tr 可以从标准输入中读取,正如您已经证明的那样 :-) 请注意,您几乎没有理由要对单个文件进行分类。
    • @dave:你说得对,我看错了帖子。不过,重点是输入重定向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多