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ć trtakiego:
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.
trdłuższe ciągi. W moim systemietrprzewyższa bash zaczynając od ciągów zawierających więcej niż1000znaki. 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)trwziął0.04si bash 5.0.11 wziął17s. Z 2Mtrwziął0.07s(oczekiwany), ale bash wziął69s(4 razy więcej na dwa razy długość łańcucha).