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.
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.
Odpowiedzi:
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
! ... 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:
tr " " .
Przykład:
# echo "hello world" | tr " " .
hello.world
Od man tr
:
OPIS
Przetłumacz, ściśnij i / lub usuń znaki ze standardowego wejścia, pisząc na standardowe wyjście.
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.
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
Użyj podstawienia parametru:
string=${string// /.}
Wypróbuj to dla ścieżek:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
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.
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
. Cytaty są nieistotne.
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).