在行首 grep 固定字符串

在行首 grep 固定字符串

grep "^$1"有点有效,但我如何转义"$1",以便 grep 不专门解释其中的任何字符?

或者,还有更好的方法?

编辑: 我不想搜索,'^$1'而是搜索动态插入的固定字符串,该字符串仅在位于行开头时才应匹配。这就是我所说的意思$1

答案1

如果您只需要检查是否找到匹配项,请将所有输入行剪切为所需前缀 ( $1) 的长度,然后使用固定模式 grep:

if cut -c 1-"${#1}" | grep -qF "$1"; then
    echo "found"
else
    echo "not found"
fi

获取匹配行的数量也很容易:

cut -c 1-"${#1}" | grep -cF "$1"

或者所有匹配行的行号(行号从1开始):

cut -c 1-"${#1}" | grep -nF "$1" | cut -d : -f 1

您可以输入行号headtail获取匹配行的全文,但此时使用 Python 或 Ruby 等现代脚本语言会更容易。

(上面的示例假设 Posix grep 和 cut。它们假设要搜索的文件来自标准输入,但可以轻松地改为采用文件名。)

编辑:您还应该确保模式 ( $1) 不是零长度字符串。否则cut说不出来values may not include zero。另外,如果使用 Bash,请使用set -o pipefail来捕获错误退出cut

答案2

一种使用 perl 的方法,它将尊重反斜杠

v="$1" perl -ne 'print if index($_, $ENV{"v"} )==0' file

这将为命令设置环境变量 v,然后打印该变量的索引是否为 0(即行的开头)。

你也可以在 awk 中做同样的事情

v="$1" awk 'index($0, ENVIRON["v"])==1' file

答案3

我想不出一种方法可以使用grep;来做到这一点^其本身是正则表达式的一部分,因此使用它需要解释正则表达式。使用 中的子字符串匹配awk或其他方式很简单perl

awk -v search="$1" 'substr($0, 1, length(search)) == search { print }'

要处理包含 的搜索字符串\,您可以使用与中相同的技巧123的回答:

search="$1" awk 'substr($0, 1, length(ENVIRON["search"])) == ENVIRON["search"] { print }'

答案4

如果你的 grep 有 -P 选项,这意味着聚合酶链式反应, 你可以这样做:

grep -P "^\Q$1\E"

参考这个问题,并查看PCRE文档如果您愿意,请了解详细信息。

相关内容