Używając sed
, często tworzę raczej skomplikowane i skomplikowane wyrażenia regularne, które muszę dwukrotnie dopasować w pliku. Czy istnieje sposób na zapisanie tego wyrażenia regularnego i odwołanie go dwa razy?
Może coś, co wygląda tak?
sed ' complicated_regex=/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+$/
s/complicated_regex:complicated_regex/simple-output/
' my_file
Aktualizacja: Odpowiedź przedstawiła rozwiązanie polegające na użyciu zmiennej bash. To nie działa Biorąc pod uwagę test.txt
.
#test.txt
foo bar
bar foo
I scenariusz
#!/bin/bash
VALUE='foo \([a-z]\+\)'
sed 's/"${VALUE}"/foo happy \1/' test.txt
To powinno dać wynik
foo happy bar
bar foo
Ale zamiast tego pojawia się błąd
sed: -e expression #1, char 24: invalid reference \1 on `s' command's RHS
sed
regular-expression
Cory Klein
źródło
źródło
perl -pe 's/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+:\1$/simple_output/' my_file
sed 's/'"${VALUE}"'/foo happy \1/' test.txt
Odpowiedzi:
Możesz użyć zmiennych powłoki:
Nie jestem pewien, co miałeś na myśli
$i
, ale może być konieczne umieszczenie go poza pojedynczymi cudzysłowami:źródło
sed
polecenie jest wywoływane z powłoki, ale istnieje podobne rozwiązanie z prawie wszystkimi językami programowania. (I nie sądzę, aby można było używać zmiennych wsed
s/$complicated_regex/\1/
podaje błąd informujący, że jest to nieprawidłowe odwołanie.sed "s/^${complicated_regex}:${complicated_regex}\$/simple-output/" my_file
Najłatwiejszym sposobem na dodanie wartości zmiennej powłoki
sed
i nie martwienie się o to, jak ucieczka w odwrotny ukośnik będzie musiała się zmienić w pozostałej częścised
skryptu, jest wypełnienie wszystkiego pojedynczymi cudzysłowami oprócz zmiennej i umieszczenie tego w cudzysłowach.Wszystkie poniższe przykłady kodu zakładają:
VALUE='foo \([a-z]\+\)'
Następujący uszkodzony kod kończy się niepowodzeniem, ponieważ zmienna
VALUE
nie jest rozwinięta:Poniższy uszkodzony kod kończy się niepowodzeniem, ponieważ ukośnik odwrotny
\1
zostaje zjedzony przez powłokę (ponieważ występuje w cudzysłowie, a nie w cudzysłowie), zanimsed
go zobaczy:Poniższy kod działa zgodnie z oczekiwaniami:
Działa również następujący kod:
Podobnie jest w przypadku:
Ale po co się komplikować? Pojedyncze cudzysłowy wokół
sed
skryptu sprawiają, że wszystko jest znacznie wyraźniejsze, szczególnie dla guru nie-powłoki-skryptów, który czyta twój kod. Moim ulubionym sposobem jest zrezygnowanie z pojedynczych cudzysłowów z podwójnymi cudzysłowami tylko dla rozszerzenia zmiennej i przejście od razu do pojedynczych cudzysłowów:źródło