2014-11-10 16 views
9

Chcę zmienić niektóre nazwy w pliku za pomocą sed. Jest to, jak plik wygląda następująco:sed zastąpić dokładny mecz

#! /bin/bash 

SAMPLE="sample_name" 
FULLSAMPLE="full_sample_name" 

... 

Teraz tylko chcę zmienić sample_name & nie full_sample_name korzystając sed

Próbowałem to

sed s/\<sample_name\>/sample_01/g ... 

Myślałem \ <> mogą być wykorzystane do znajdź ścisłe dopasowanie, ale kiedy go użyję, nic się nie zmieni.

Dodanie "" pomogło zmienić tylko nazwę próbki. Jednak jest jeszcze inny problem teraz: moja sytuacja była nieco bardziej skomplikowana niż wyjaśniono powyżej, ponieważ mój sed polecenia jest osadzony w pętli:

while read SAMPLE 
do 
    name=$SAMPLE 
    sed -e 's/\<sample_name\>/$SAMPLE/g' /path/coverage.sh > path/new_coverage.sh 
done < $1 

Więc sample_name powinien zostać zmieniony z wartości dołączonym do $ próbki. Jednak po uruchomieniu polecenia nazwa próbki zmieniono na $ SAMPLE, a nie na wartość dołączoną do $ SAMPLE.

+0

Jaki system jesteś stronie i jaka jest twoja wersja sed? – anubhava

+0

Co chcesz zrobić? Kilka przykładów podoba – nowox

+0

GNU sed wersja 4.2.1 – user1987607

Odpowiedz

10

wierzę \< i \> praca z GNU sed, wystarczy zacytować sed polecenie:

sed -i.bak 's/\<sample_name\>/sample_01/g' file 
+0

"pracował tylko zmienić sample_name. Jednak teraz mam inny problem, patrz wyżej w moim pytaniu. – user1987607

+2

Musisz użyć podwójnych cudzysłowów zamiast pojedynczych cudzysłowów, aby użyć zmiennych powłoki w poleceniu sed: "sed" s/\ /$ SAMPLE/g "/ path/coverage.sh' – anubhava

+1

dzięki, to działa idealnie – user1987607

2

GNU sed, następujące prace polecenia:

sed 's/\<sample_name\>/sample_01/' file 

Jedyną różnicą jest to, że mam zamknięte polecenia w apostrofach. Nawet jeśli jest to konieczne, aby podać polecenie sed, widzę bardzo małą wadę (i pomaga to uniknąć tego rodzaju problemów).

Innym sposobem osiągnięcia tego, co chcesz bardziej przenośnie jest dodanie cytaty do wzorca i zastąpienia:

sed 's/"sample_name"/"sample_01"/' script.sh 

Alternatywnie, składnia Ci zaproponowali również pracuje w GNU awk:

awk '{sub(/\<sample_name\>/, "sample_01")}1' file 

Jeśli chcesz użyć zmiennej w ciągu zastępczym, musisz użyć podwójnych cudzysłowów zamiast pojedynczych, na przykład:

sed "s/\<sample_name\>/$var/" file 

Zmienne nie są rozszerzane w ramach pojedynczego cudzysłowu, dlatego otrzymujesz nazwę zmiennej, a nie jej zawartość.

1

@ user1987607

Można to zrobić w następujący sposób:

sed s/"nazwa próbki">/sample_01/g

gdzie "sample_name" w cudzysłowie "" pasuje do dokładnej wartości ciągu.

/g służy do wymiany globalnej.

Jeśli "sample_name" pojawia się ten ifsample_name i chcesz wymienić, że dobrze to należy użyć następującego:

sed s/"sample_name "> /" sample_01"/G

Tak, że zastępuje tylko żądane słowo. Na przykład powyższa składnia zastąpi słowo "the" z pliku tekstowego, a nie ze słów takich jak ten.

Jeśli jesteś zainteresowany wymianą tylko pierwsze wystąpienie, to będzie działać grzywny

sed s/"sample_name"/sample_01/

Nadzieja pomaga