【问题标题】:What is logical AND in Sed/Vim?Sed/Vim 中的逻辑与是什么?
【发布时间】:2010-11-10 04:12:22
【问题描述】:

我想为下面的 Vim 命令添加一个 AND 运算符

:command! -nargs=1 GrepSource :! grep <args> `sed -n 's/^source \(.*\)/\1/p' %`

这样我就可以使用该命令在以下位置查找源代码了

# source <path>
# . <path> 
source <path>
. <path>

我不确定是否可以将 AND 运算符用于 SED 或 Vim。

如何在 SED 命令中添加 AND 运算符?

【问题讨论】:

    标签: vim random sed


    【解决方案1】:

    我不清楚您要实现/搜索什么。也许如果您详细说明您到底想做什么以及 AND 应该做什么,我们可以提供更多帮助。

    此解决方案从 vim 命令执行:

    grep PATTERN /some/path/*
    

    如果您正在寻找您将使用的目录中的文件:

    ls /some/path | grep PATTERN
    

    您可以更新命令的相关部分。

    无论如何...

    从您的脚本中,我假设您有一行指定您想要 grep 的目录的路径,例如您想搜索 PATTERN 的路径,将光标放在带有路径的行上,然后您想提取路径并使用命令将其 grep 用于模式,文件中的示例行:

    source /some/path
    

    这个命令应该会如你所愿:

    :command! -nargs=1 GrepSource :exe printf("!grep '<args>' '%s'/*", substitute(
    getline('.'), "\\%(source\\s*\\)\\(.*\\)$", "\\1",""))
    

    将光标放在以word source开头的路径的行上,您可以执行上述命令:

    :GrepSource PATTERN
    

    这将在 '/some/path/' 中的文件中搜索单词 PATTERN。

    我假设您文件中的路径不以斜杠“/”结尾,并且我假设您想要在文件中搜索,所以我在搜索路径末尾附加“/*”,以命令结尾:

    grep PATTER /some/path/*
    

    我使用了substitute 命令来替换

    source /some/path
    

    与

    /some/path
    

    然后在printf 中使用它来创建实际的命令。

    【讨论】:

    • @stefanB:我运行你的命令没有成功。 --- 它的目的似乎与too much php 的相同。区别在于substitute 和正则表达式的使用。
    【解决方案2】:

    您可以只使用 Vim 正则表达式来查找 &lt;path&gt; 名称,而不是使用 sed:

    :command! -nargs=1 GrepSource :exe printf("!grep '<args>' '%s'", matchstr(getline('.'), '^#\=\s*\%(source\|\.\)\s*\zs\f\+'))
    

    我认为该命令应该执行您想要的操作。您可以使用下一条命令来测试发生了什么('exe' 更改为 'echo'):

    :command! -nargs=1 GrepSourceTest :echo printf("!grep '<args>' '%s'", matchstr(getline('.'), '^#\=\s*\%(source\|\.\)\s*\zs\f\+'))
    

    该命令必须以下列形式之一在一行中使用:

    # source <somefile>
    # . <somefile>
    source <somefile>
    . <somefile>
    

    【讨论】:

    • 我无法让您的命令正常工作。请说出您的命令是否在您的机器上工作。 --- 我使用 Vim 7.2,OS X Leopard。
    • 我也在 OS X 10.5 上使用 7.2。使用第二个命令(GrepSourceTest)得到了什么输出?确保您的光标位于“source ”或“. ' 或 '# 。 '
    • 你的命令很棒! --- 我没有想到这样的命令。 --- 我正在寻找一个 greps 所有来源 PATH 的命令。为此,我们需要过滤想要的行并将它们提供给 Grep。 --- 我不确定我们如何在单行中过滤/搜索这些行。
    • 你的命令比我预期的要好。 --- 我可以通过:!grep -r ~/bin/wanted-dir grep 当前目录中的所有文件。我的命令的弱点在于,它在分析具有长文件且文件源位于完全不同位置的项目时是不切实际的。
    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 2010-09-28
    • 2010-09-26
    • 2011-09-07
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多