Próbuję grep ciąg ścieżki, wszystko wewnątrz podwójnych cytatów. W przypadku pętli przechodzi przez plik test.txt, wyszukuje nowy1.xml dla dopasowania. Jeśli zostanie znaleziony, drukuje ciąg w środku ścieżki.

Oczekiwany wynik

abc/test/test
abc/test/test
cd/test1/test2
cdf

Test.txt

test/test
test/test
test1/test2
test1

New1.xml.

<abc name="test/test" path="abc/test/test"  />
<abc name="test/test1" path="abc/test/test1"  />
<abc name="test1/test2" path="cd/test1/test2" />
<path="cdf" name="test1" />

Scenariusz

for f in test.txt
    do
    echo "Processing $f"
        paste $f | while read lines; do
            results=`cat new1.xml | grep -o "name.*$lines.*" | grep -o 'path.*' | sed 's/[^"]*"\([^"]*\)".*/\1/'`
        done
    done

Wynik

abc/test/test
abc/test/test1
1
Mihir 17 luty 2017, 00:45

2 odpowiedzi

Najlepsza odpowiedź

Możesz napisać pętlę trochę bardziej efektywnie i użyć sed zamiast wielu grep s, aby uzyskać to, co chcesz:

for f in test.txt; do
  echo "Processing $f"
  while read line; do
    grep 'name="'$line'"' new1.xml 
  done < "$f" | sed -E 's/.+path="([^"]+)".+/\1/'
done

Dla twojego przykładu powyższy skrypt podaje to wyjście:

Processing test.txt
abc/test/test

Jeśli po prostu przetwarzasz jeden plik, nie potrzebujesz zapasu zewnętrznego:

  while read line; do
    grep 'name="'$line'"' new1.xml
  done < "test.txt" | sed -E 's/.+path="([^"]+)".+/\1/'
1
codeforester 16 luty 2017, 23:28

W swoim kodzie, jeśli dostosujesz ostatnią część do:

....|grep -o 'path=\".*\"' |sed 's/[^"]*"\([^"]*\)".*/\1/' 

Powinno działać. Nie przetestowałem twojego całego kodu, tylko grep + sed.

Widzę też, że są jakieś backticks wokół polecenia SED. Jeśli tak, muszą zostać usunięte.

W moim teście działało to:

echo -e "<abc name="test/test" path=\"abc/test/test\"  />" |grep -o 'path=\".*\"' |sed 's/[^"]*"\([^"]*\)".*/\1/'
abc/test/test

Alternatywny sposób izolowania tego, czego potrzebujesz bez pętli, ale z pojedynczym poleceniem byłoby

grep -F -f test.txt new1.xml |grep -o 'path=\".*\"' |sed 's/[^"]*"\([^"]*\)".*/\1/' #or a simpler sed like |sed 's/path=//; s/\"//g'

GREP -F: Szukaj ustalonych ciągów, nie Regex
-F: Wzory ładowania z pliku

Inna alternatywa:

echo -e "<abc name="test/test" path=\"abc/test/test\"  />" |sed -e 's/^.*path=\"//; s/\" .*$//g'
#in your case:
grep -F -f test.txt new1.xml |sed -e 's/^.*path=\"//; s/\" .*$//'

Aktualizacja: Testowanie jednym wkładką:

$ cat file3
test/test
test/test
test1/test2
test1

$ cat file4
<abc name="test/test" path="abc/test/test"  />
<abc name="test/testsdk" path="abc/test/testsdk" />
<abc name="test/test" path="abc2/test/test"  />
<abc name="test1/test2" path="ggg/test1/test2"  />
<abc name="test2/test2" path="vvv/test2/test2"  />
<path="cdf" name="test1" />

$ grep -F -f file3 file4 |sed 's/^.*path=//; s/\"//g; s/ .*$//g'
abc/test/test
abc/test/testsdk
abc2/test/test
ggg/test1/test2
cdf
1
George Vasiliou 17 luty 2017, 14:34