LINUX.ORG.RU

Bash поиск совпадений двух переменных

 ,


0

2

var1=«01000ccccccc 01000ccccccd 0180c2000000 0180c2000001 0180c2000002 0180c2000003 0180c2000004 0180c2000005 0180c2000006 0180c2000007 0180c2000008 0180c2000009 0180c200000a 0180c200000b 0180c200000c 0180c200000d 0180c200000e 0180c200000f 0180c2000010 777 6cab059e9df4 776 6cab059e9df4 776 776 774 4447cc65aa58 774 6cab059e9df4 773 00f66363c828 773 6cab059e9df4 775 6cab059e9df4 29»
var2=«Start 000c41 6cab05 000e08 000f66 001217 001310 0014bf 0016b6 001839 0018f8 001a70 001c10 001d7e 001ee5 002129 00226b 002369 00259c 20aa4b 48f8b3 586d8f 687f74 98fc11 c0c1c0 c8b373 c8d719 END»

Необходимо сравнить две переменных $var1 $var2, и если найдено совпадение то выводим его. Например в var1 есть строка 6cab059e9df4 в var2 строка 6cab05 результат выводим найденную строку 6cab059e9df4
пробовал так

grep $var1 <<< $var2
echo $var1 | grep $var2
Валит ошибки «Нет такого файла или каталога»
Просьба помочь


Ответ на: комментарий от Bagrov
for elem1 in $var1 ; do
   for elem2 in $var2 ; do
       [ $elem1=$elem2 ] && echo $elem2
   done
done | sort -u

Ему нужно не точное совпадение, а наличие подстроки.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Спасибо. Не оптимально из-за постоянного дерганья грепа, но работает:

for elem1 in $var1 ; do
   for elem2 in $var2 ; do
       grep <<<$elem1 $elem2
   done
done | sort -u
Bagrov ★★★★★
()

Парни @Bagrov и @DELIRIUM

Так просто грепать нельзя, искомую строку нужно предварительно экранировать. Иначе, если попадутся регулярные спецсиволы будет либо ошибка, либо найдёт совсем не то, на что вы расcчитывали.

surefire ★★★
()
Ответ на: комментарий от surefire

Это только для GNU grep. У меня где-то была чудо-регулярка на перле, которая экранирует строку как раз для таких целей. Проверена в боевых условиях.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Вот так сработает даже на обычном sh без башизмов.

Маленькая поправочка, это не совсем годится для reqsubstr='*', даже если б задача стояла найти по маске, так как *$reqsubstr* тогда эту маску портят, следовательно надо [ -z "${string##*"$reqsubstr"*}" ]

vodz ★★★★★
()

Ну и жесть, читаю-офигеваю, вот так на PowerShell:

$var1.Split() | ForEach-Object { 
  foreach($2 in $var2.Split()) { 
    if($_.Contains($2)) { echo $_ } 
  } 
} | sort -u

insw
()
Последнее исправление: insw (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Я допустил ошибку, но благодаря графике ты сразу ее увидел, с визуализацией даже отладчики не нужны. Заменить = на contains и готово, пофикшено! А ведь в каком нибудь С я мог бы начать сравнивать указатели...

insw
()
Ответ на: комментарий от insw

В первом посте от @Bagrov я такую же ошибку тоже сразу увидел без всякой графики.

В каком-нибудь C strcmp вместо strstr тоже сразу бы поймалось.

DELIRIUM ☆☆☆☆☆
()
Последнее исправление: DELIRIUM (всего исправлений: 1)
Ответ на: комментарий от surefire

Так просто грепать нельзя, искомую строку нужно предварительно экранировать.

Или перед их циклами поставить set -f. Ну и это до кучи.

vodz ★★★★★
()
Ответ на: комментарий от DELIRIUM

Возможно ты просто человек-отладчик, или помидор-отладчик, не знаю как лучше.

insw
()

Нормальные люди списки строк хранят в файлах, тогда и грепом удобнее пользоваться

grep -Ff <(tr ' ' '\n' < var2.txt) var1.txt

01000ccccccc 01000ccccccd 0180c2000000 0180c2000001 0180c2000002 0180c2000003 0180c2000004 0180c2000005 0180c2000006 0180c2000007 0180c2000008 0180c2000009 0180c200000a 0180c200000b 0180c200000c 0180c200000d 0180c200000e 0180c200000f 0180c2000010 777 6cab059e9df4 776 6cab059e9df4 776 776 774 4447cc65aa58 774 6cab059e9df4 773 00f66363c828 773 6cab059e9df4 775 6cab059e9df4 29

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Нормальные люди списки строк хранят в файлах, тогда и грепом удобнее пользоваться

Ну да, это же так удобно в файле вставить, удалить элемент. Некрасиво вы пытаетесь подогнать под ответ.

vodz ★★★★★
()
$ sed -r 's/\s+/\n/g' <<< "$var1" | grep -E "$(sed -r 's/\s+/|/g' <<< "$var2")"
6cab059e9df4
6cab059e9df4
6cab059e9df4
6cab059e9df4
6cab059e9df4
Tanger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.