我有一个名为dictionary.txt的巨大文本文件,其中包含以下条目
ABC_SEQ_NUM This represents....
ABC_RANK This represents....
ABC_BSC_ID This represents...
PQR_TA_DATE_AF This represents...
XYZ_C_ID This represents...
在另一个文件中,我有一个程序的源代码,该程序使用其中一些缩写作为其变量名称的一部分。变量名经常使用上面的条目如下
Facilitator.TMP_ABC_SEQ_NUM
所以我无法简单地使用 grep 搜索 TMP_ABC_SEQ_NUM,因为它不会返回任何匹配项。但是,变量名称的最后部分(“ABC_SEQ_NUM”)实际上存在于文本文件中。
所以我想说的是
grep (longest match for) TMP_ABC_SEQ_NUM in dictionary.txt
这样它就会返回匹配项
ABC_SEQ_NUM
这样的命令怎么写呢?
答案1
这将尝试从头开始匹配:
t=TMP_ABC_SEQ_NUM
for n in $(seq 0 ${#t})
do
grep ${t:n} dictionary.txt && break
done
这将搜索最长的序列,无论它从哪里开始:
for len in $(seq ${#t} -1 3)
do
for start in $(seq 0 $((${#t}-len)))
do
grep ${t:start:len} dictionary.txt && break 2
done
done
要求:类似 bash 的 shell,可在此处获取:许多 GNU-utils 的本机 win32 端口,如 sh.exe、grep、sed、awk、bc、cat、tac、rev、col、cut、...
答案2
一种可能的方法是从头部缩短字符串直到匹配:
#!/bin/sh
string="TMP_ABQ_SEQ_NUM"
while ! grep "$string" dictionary.txt; do
# remove the shortest leading string ending with "_"
string="${string#*_}"
done
答案3
你能扭转一下你看待这个问题的方式吗?您是否可以不查找源文件中 (ABQ_SEQ_NUM) 中每一行的第一个字段,而不是查找TMP_ABQ_SEQ_NUM
in ?dictionary.txt
dictionary.txt
如果是这种情况,以下操作应该有效
#!/bin/bash
for i in $(awk '{print $1}' dictionary.txt) do
grep $i $1
done
将要检查dictionary.txt 中存在的序列的文件的名称传递给上述脚本。如果这不是您想要的,我们深表歉意。