Muszę być w stanie zrobić to zastąpić spację ( ) kropką (
.
) w ciągu w bash.
Myślę, że byłoby to dość proste, ale jestem nowy, więc nie mogę wymyślić, jak zmodyfikować podobny przykład dla tego zastosowania.
Użyj wbudowanej zamiany łańcucha powłoki. Przykład:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
Więcej informacji można znaleźć na stronie http://tldp.org/LDP/abs/html/string-manipulation.html .
tr
dłuższe ciągi. W moim systemietr
przewyższa bash zaczynając od ciągów zawierających więcej niż1000
znaki. Wydaje się, że złożoność czasu bash jest gorsza niż liniowa. Mały test:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Przy długości łańcucha 1M (= 2 ^ 20)tr
wziął0.04s
i bash 5.0.11 wziął17s
. Z 2Mtr
wziął0.07s
(oczekiwany), ale bash wziął69s
(4 razy więcej na dwa razy długość łańcucha).tr
! ... W zależności od dostępnej pamięci i zasobów sprzętowych ... Ale masz rację !: W zależności od rodzaju zadania, dedykowane narzędzia pozostają wydajniejsze!$'\n'
Możesz użyć
tr
takiego:Przykład:
Od
man tr
:źródło
W bash możesz wykonać zamianę wzoru w ciągu za pomocą
${VARIABLE//PATTERN/REPLACEMENT}
konstrukcji. Używaj tylko/
i nie//
zastępuj tylko pierwszego wystąpienia. Wzorzec jest wzorem wieloznacznym, podobnie jak globusy plików.źródło
Spróbuj tego
źródło
Użyj podstawienia parametru:
źródło
Wypróbuj to dla ścieżek:
Zastępuje spację wewnątrz ciągu podwójnego cudzysłowu znakiem
+
sing, następnie zastępuje+
znak odwrotnym ukośnikiem, a następnie usuwa / zamienia cudzysłowy.Musiałem to wykorzystać, aby zastąpić spacje na jednej ze ścieżek w Cygwin.
źródło
sed
. Cytaty są nieistotne.