Один способ сделать это - к несколько обратному идея, которой вход и использование a.txt
как шаблоны для поиска и что Вы называете "входом" (я назову "file2") чтобы быть, что ищется в:
grep -o -f a.txt file2
или
echo "/abc/dog" | grep -o -f a.txt
Они ничего не произведут для "/собака", хотя echo
версия будет иметь ненулевой код возврата.
Править:
Это будет более тесно соответствовать Вашему требуемому выводу:
while read -r line
do
match=$(echo "$line" | grep -of a.txt)
match=${match:-(NONE)}
printf "%-12s => %s\n" "$line" "$match"
done < file2
Можно вынудить шаблоны поиска запуститься в начале строки как это:
grep -o -f <(sed 's/^/^/' a.txt) file2
Походит на задание для Perl, таким образом, вот awk решение. Минимально протестированный.
#!/bin/sh
prefixes_file=$1
shift
awk -vprefixes_file="$prefixes_file" '
BEGIN {
while (getline <prefixes_file) { ++prefixes[$0]; }
}
{
for (n = length; n >= 0; --n) {
if (prefixes[substr($0,1,n)]) {
print $0, "=>", substr($0,1,n);
break;
}
}
if (n == -1) { print $0, "=>", "(NONE)"; }
}' "$@"
Простой сценарий оболочки должен сделать задание:
#!/bin/sh
query=$1
file=$2
for i in $(seq 1 ${#query})
do
current_query=$(echo $query | cut -b1-$i)
grep -q "$current_query" "$file" || break;
longest_match=$current_query
done
echo "$longest_match"
Можно использовать его как:
longest_match.sh '/abc/dog' a.txt
и это распечатает самое долгое соответствие запроса /abc/dog
найденный в файле a.txt, т.е. /abc/d