Jak zmienić ścieżkę do pliku w SED?

39

Chciałbym wymienić $fileWithPathw $file, jednak to nie działa, bo (chyba) ścieżka nie uciekł. Jak uciec?

sed -i 's/${fileWithPath}/HAHA/g' $file
UAdapter
źródło

Odpowiedzi:

71
sed -i 's|'$fileWithPath'|HAHA|g' file

Pojedyncze cudzysłowy definiują literał łańcuchowy. Umieszczenie zmiennej poza literałem pozwala powłoce rozwinąć tę część.

Ponadto: jeśli zamierzasz analizować ścieżki, użyj separatora w poleceniu sed, który nie myli się z ogranicznikiem katalogu „/”.

ata
źródło
1
Uwaga: jeśli $fileWithPathzawiera spacje, wstawiany jest niewłaściwy wzór.
Lekensteyn,
Twoja dodatkowa wskazówka dotycząca zmiany ogranicznika ścieżek plików uratowała życie!
Shadoninja
Myślę, że masz za dużo cytatów. Mój przykład sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnwydaje się działać.
Léo Léopold Hertz 준영
15

W okolicznościach, w których zastępujący ciąg lub ciąg wzorca zawierają ukośniki, możesz skorzystać z faktu, że GNU sed zezwala na alternatywny ogranicznik dla polecenia zastępczego. Typowe opcje dla separatora to znak potoku | lub hash # - najlepszy wybór znaku ograniczającego będzie często zależeć od typu przetwarzanego pliku. W twoim przypadku możesz spróbować

sed -i 's#'$fileWithPath'#HAHA#g' $file

Znak „g” po ostatnim # służy do zmiany wszystkich wystąpień w pliku, jeśli trzeba zmienić tylko pierwsze wystąpienie, a następnie usunąć „g”.

c0m3t
źródło
14

Lepszy sposób na dosłowne ciągi znaków z ukośnikami:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt
Jeff Lancaster
źródło
Ten zasłużył na Oscara! Prosty i elegancki
Toan Nguyen