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

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 „/”.


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”.


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

Ten zasłużył na Oscara! Prosty i elegancki
Toan Nguyen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.