Mam dwa różne pliki:
Plik 1
/home/user1/
/home/user2/bin
/home/user1/a/b/c
Plik 2
<TEXT1>
<TEXT2>
Chcę wymienić <TEXT1>
z pliku Plik2 z treścią File1 użyciu sed
. Próbowałem tego polecenia, ale nie otrzymałem właściwego wyniku:
cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"
Możesz również użyć innych narzędzi, aby rozwiązać ten problem.
sed
implementacji używasz. Twój kod działa dla mnie z GNUsed
./home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>
. Brak nowych linii.diff
ipatch
narzędzia pozwalają dość łatwo zastąpić niektóre linie w pliku innymi liniami.$()
pomocą skryptu sed powoduje, że moje oczy krwawią. Nigdy nie używaj danych zewnętrznych w miejscach, w których niektóre znaki są interpretowane ze szczególnym znaczeniem.Odpowiedzi:
Oto rozwiązanie skryptu sed (łatwiejsze dla oczu niż próba umieszczenia go w jednej linii w wierszu poleceń):
Uruchamianie:
źródło
sed '/<TEXT1>/{rFile1^Md^M}' File2
gdzie „^ M” oznacza naciśnięcie klawisza Return. Problem polega na tym, że sed naprawdę potrzebuje znaków nowej linii w {...}, aby rozgraniczić polecenie r i d.sed $'/<TEXT1>/ {r File1\n d}'
sed -e '/<TEXT1>/{r File1' -e 'd}' File2
<TEXT1>
, chcę po prostu zastąpić sam łańcuch, pozostawiając resztę linii nienaruszoną?Text1: <TEXT1>
doText1: <file_contents>
.Długo zajęło mi znalezienie tego rozwiązania za pomocą zamiany var. Wszystkie rozwiązania sed nie działały dla mnie, ponieważ albo usuwają pełne wiersze, albo zastępują niepoprawnie.
Zastępuje wszystkie wystąpienia TEKSTU 1 w pliku 2 względem zawartości pliku 1. Cały pozostały tekst pozostaje nietknięty.
źródło
sed
też, ponieważ te „rozszerzenia” (inaczej zamienniki) są wbudowane w powłokę (bash
przynajmniej)Odpowiadam, ponieważ w niektórych przypadkach metoda
diff
/patch
może być interesująca. Aby zdefiniować podstawienie linii zawartych w plikublob1
przez linie zawarte wblob2
użyciu:Na przykład, jeśli
blob1
zawiera:i
blob2
zawiera:wygenerowane
patch-file
będą:Teraz możesz zastosować tę poprawkę do dowolnego innego pliku:
Zastąpi on
hello
,you
liniachbe
,welcome
,here
linie wsomefile
.źródło