Jeśli jest oparty na linii i tylko jeden wiersz do zastąpienia, zalecam wcześniejsze przygotowanie samego pliku za pomocą wiersza zastępującego printf
, przechowywanie pierwszego wiersza w polu sed
wstrzymania i upuszczanie go w razie potrzeby. W ten sposób nie musisz się martwić o znaki specjalne. (Jedynym założeniem tutaj jest to, że $VAR
zawiera jeden wiersz tekstu bez żadnych nowych linii, co już powiedziałeś w komentarzach.) Poza nowymi liniami, VAR może zawierać cokolwiek i to zadziała niezależnie.
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/KEYWORD/g'
printf '%s\n'
wypisze zawartość $VAR
jako ciąg dosłowny, niezależnie od jego zawartości, a następnie nowy wiersz. ( echo
w niektórych przypadkach zrobi inne rzeczy, na przykład jeśli treść $VAR
zaczyna się od myślnika - zostanie to zinterpretowane jako przekazanie flagi opcji echo
).
Nawiasy klamrowe są używane do dodania wyjścia printf
do zawartości po somefile
jej przekazaniu sed
. Ważna jest tutaj biała spacja oddzielająca nawiasy klamrowe, podobnie jak średnik przed zamykającym nawias klamrowy.
1{h;d;};
jako sed
komenda będzie przechowywać pierwszą linię tekstu w sed
„s miejsca przechowywania , a następnie d
suĹ linię (zamiast drukowanie).
/KEYWORD/
stosuje następujące działania do wszystkich wierszy, które zawierają KEYWORD
. Akcja jest g
et, która pobiera zawartość przestrzeni wstrzymania i upuszcza ją w miejsce przestrzeni wzorca - innymi słowy, całą bieżącą linię. (To nie jest zamiana tylko części linii.) Nawiasem mówiąc, przestrzeń wstrzymania nie jest opróżniana, po prostu kopiowana do przestrzeni wzorów, zastępując wszystko, co tam jest.
Jeśli chcesz zakotwiczyć wyrażenie regularne, aby nie pasowało ono do linii, która zawiera tylko SŁOWO KLUCZOWE, ale tylko linię, w której nie ma nic innego oprócz KEYWORD, dodaj początek linii anchor ( ^
) i koniec linii anchor ( $
) do twoje wyrażenie regularne:
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'
sed
i nie być wyjątkowymi, po prostu uciec od nich ukośnikiem odwrotnym.VAR='hi\/'
nie daje takiego problemu.