Używam sed do znajdowania i zastępowania wzorców w plikach SAS, które mam, zamiast zmieniać je indywidualnie. Problem polega na tym, że próbuję zastąpić makrozmienne, a gdy używam ampersand, nie przetwarza to poprawnie.
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
za każdym razem, gdy uruchamiam to polecenie, wydaje się, że dołącza się i wykonuje różne czynności z oryginalnym tekstem.
Pytanie: Jak zastąpić tekst zawierający znaki ampersand poleceniem sed?
&
jest postacią specjalną, dlatego należy go uciec, gdy jest używany w RHS - w twoim przypadku musisz biec,'s/user=&uid./user=\&sysuserid./g'
chociaż podejrzewam, że musisz także uciec z kropki w LHS, aby dopasować dosłowną kropkę, więc naprawdę potrzebujesz's/user=&uid\./user=\&sysuserid./g'
Odpowiedzi:
&
jest wyjątkowy w tekście zastępczym: oznacza „całą część danych wejściowych, która została dopasowana do wzorca”, więc to, co tutaj robisz, zastępujeuser=&uidX
sięuser=user=&uidXsysuserid.
. Aby wstawić rzeczywistą ampersand do tekstu zastępczego, użyj\&
.Kolejną rzeczą, która wygląda źle, jest to, że
.
wzorzec wyszukiwania oznacza dowolny znak (oprócz nowej linii), ale.
na końcu tekstu zastępczego jest dosłowna kropka. Jeśli chcesz zastąpić tylko ciąg literalnyuser=&uid.
, chroń go.
odwrotnym ukośnikiem.Jeśli chcesz zastąpić dowolny znak i zachować go w wyniku, umieść go w grupie i użyj
\1
w zamianie, aby odnieść się do tej grupy.W rzeczywistości, biorąc pod uwagę powtórzenie między oryginalnym tekstem a zamiennikiem, i tak powinieneś używać grup:
tzn. „zamień
u
nasysuser
pomiędzyuser=&
iid.
”.źródło
\(user=&\)
jest wzorcem, który pasujeuser&
i przechowuje ciąg dopasowania jako grupę (grupa numer 1, ponieważ jest to pierwsza grupa we wzorcu). Następnie w zastępstwie\1
zastępuje się ciąg zapisany dla grupy numer 1.=
w wyrażeniach regularnych i w tekście zastępczym oznacza sam dla siebie, więcuser=&
pasuje tylkouser=&
, auser=&
w tekście zastępczym pojawiauser=
się część wiersza dopasowana przez wyrażenie regularne.=
Postać nie ma żadnego specjalnego znaczenia.user=&
w tekście zastępczym powstajeuser=
następujący po nim oryginalny dopasowany tekst.user=\&
w tekście zastępczym produkujeuser=&