我有一个文件,我在那里搜索位于行尾的数字
尝试和信任,由Horatio Alger,Jr。1
学校的流浪男孩,Arthur M. Winfield 11
海外流浪汉,第1部分,马克吐温23
如果我搜索1,我想打印第一行,其中1位于该行的末尾。不是第二行,其中有11,或第三行,其中1位于句子的中间。
echo "Enter the content you are searching for:"
read foo
if x=$(grep -A 1 -i "$foo\$" GUTINDEX.ALL)
then echo -e "$x"
fi
\ $用于检测线路的末尾,但这不起作用。为什么呢?
答案 0 :(得分:1)
使用awk:
$ foo=1
$ awk -v s="$foo" '$NF==s' file
Try and Trust, by Horatio Alger, Jr. 1
说明:
$ awk -v s="$foo" ' # the search term in s var
$NF==s # if the last field is equal to s print the record
' file
答案 1 :(得分:0)
问题是包含11的行也以1结尾。尝试在foo
之前添加空格,因此您匹配整个数字:
if x=$(grep -A 1 " ${foo}$" GUTINDEX.ALL)
注意-A 1
也会在比赛结束后返回 - 我认为这是你想要的,所以我把它留在了,但如果没有删除它。数字不需要-i
,此处不涉及大小写。此外,如果没有任何可被视为变量名称的内容,您也无需转义$
bash
会将其视为常规$
。 {...}
是为了清楚起见。感谢@EdMorton提出的建议。
答案 2 :(得分:0)
如果您尝试创建一个允许您输入正则表达式(正则表达式)作为参数(位置参数)的脚本,则只需使用表单
grep "$2" "$1"
其中"$2"
是正则表达式,"$1"
是文件名。您还可以根据需要为grep
添加任何其他选项(例如匹配后的一行上下文的-A 1
等)。
一个简短的例子是:
#!/bin/bash
[ -z "$1" -o -z "$2" ] && {
printf "error: insufficient input.\n"
printf "usage: %s filename regex\n" "${0##*/}"
exit 1
}
[ -r "$1" ] || {
printf "error: file not readable '%s'\n" "$1"
exit 2
}
grep "$2" "$1"
(注意:没有必要转义'$'
,因为当它包含在字符串中时它失去了它的特殊含义 - 不执行扩展 - 只要它被引用)
示例使用/输出
$ bash parse.sh gutindex.all '[^0-9]1$'
Try and Trust, by Horatio Alger, Jr. 1
或
$ bash parse.sh gutindex.all '23$'
A Tramp Abroad, Part 1, by Mark Twain 23
有很多方法可以解决这个问题。仔细看看,如果您有其他问题,请告诉我。