2013-01-18 14 views
10

Potrzebuję użyć wyniku polecenia jako wzorca wyszukiwania w sed. Uczynię przykład za pomocą echa, ale zakładamy, że może być bardziej skomplikowane polecenia:jak używać xargs z sed w wzorcu wyszukiwania

echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt 

To polecenie nie działa, ponieważ „niektóre wzór” ma białe znaki, ale myślę, że jasno zilustrować mój problem.

Jak mogę ustawić to polecenie?

Dzięki z góry,

Odpowiedz

6

Użyj polecenia zamiast substytucji, więc Przykładem może wyglądać następująco:

sed -i "s/$(echo "some pattern")/replacement/g" file.txt 

podwójne cudzysłowy pozwalają na zastąpienie polecenia do pracy przy jednoczesnym zapobieganiu obowiązuje od bycia podzielone.

10

Musisz powiedzieć xargs, co zastąpić przełącznikiem -I - nie wydaje się, aby wiedział o {} automatycznie, przynajmniej w niektórych wersjach.

echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt 
+1

Dziękujemy! Zrobiłeś mój dzień! :) – harrison4

0

Może pracować użytkownikowi (GNU sed)

echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt 

Zasadniczo obrócić some pattern w sed polecenia podstawienia i paszy rurą do innego sed wywołania. Ostatnie wywołanie sed używa przełącznika -f, który akceptuje polecenia sed poprzez plik, w tym przypadku plik jest standardowym wejściem -.

Jeśli używasz bashu, here-string można stosować:

<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt 

nb separatory sed | i / nie powinny być częścią some pattern, w przeciwnym razie regexp nie będzie poprawnie uformowany.

1

to działa na platformie Linux (testowane):

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'