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
您可以输入行号head
并tail
获取匹配行的全文,但此时使用 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 }'