Czy chciałeś zastąpić dowolną sekwencję kolejnych x, y lub z jednym znakiem podkreślenia, czy chciałeś zastąpić każdy x, y lub z jednym znakiem podkreślenia? A co z sekwencjami mieszanymi AxyzB? Trzy podkreślenia czy jeden?
David Z
tr '[xyz]'zastąpi [i ]też. Argumentem powinna być po prostu lista znaków (chociaż zakresy jak a-zsą w porządku, aw niektórych implementacjach klasy znaków POSIX jak [:digit:]).
Na Macu otrzymałem: sed: niedozwolona opcja - użycie r: sed skrypt [-Ealn] [rozszerzenie -i] [plik ...] sed [-Ealn] [rozszerzenie -i] [-e skrypt]. .. [-f plik_skryptu] ... [plik ...]
catanore
Mam ciąg znaków, który zawiera ,[]{}()~znaki. Chcę zastąpić go każdą uciekającą postacią specjalną, '\'jak mogę to zrobić za pomocą oneshota?
inckka
2
@halakala Mac jest dostarczany z nieco inną wersją sed. Zobacz to pytanie: unix.stackexchange.com/questions/13711/... Zamiast tego możesz zainstalować „gnu-sed” za pomocą menedżera pakietów Homebrew, a następnie użyć plikugsed binarnego:$ brew install gnu-sed wtedy$ gsed -r 's/[xyz]+/_/g'
John Kary
6
Na * BSD (a więc i OSX) sed -Ejest (w zasadzie) równoważny z sed -rwieloma dystrybucjami Linuksa. Jeśli używasz sed 's/[xyz][xyz]*/_/g', nie potrzebujesz tej opcji. Oczywiście jest to równoważne, tr -s xyz _więc nie ma sedtu potrzeby .
tripleee
@inckka Nie możesz tego użyć tr. sed 's/[][{}()~,]/\\&/g'ale tak naprawdę, zadaj nowe pytanie, jeśli masz pytanie uzupełniające (oczywiście możesz powrócić tutaj tutaj w celu odniesienia). Nawiasem mówiąc, ,i ~nie są regex metaznakami (choć ~zostaje rozszerzona na $HOMEniektórych pozycjach przez bash i niektórych innych powłok; nie shjednak).
@Alexey, mój przykład działa dla mnie (wydanie bash 4.3.11 (1)). Upewnij się, że używasz bash. Inne powłoki mogą nie działać (choć niektóre będą).
Matthew Flaschen
Dziękuję @MatthewFlaschen. Właśnie tego potrzebowałem, aby wykonać zamianę sed dla absolutnej ścieżki w skrypcie bash (zastąpienie / przez \ / tak sed to akceptuje).
Ryan G
1
@RyanG po co korzystać, sedjeśli bash ma wbudowane podstawienie?
MestreLion
@MestreLion To mogło się nie udać, ale musiałem zastąpić standardową nazwę zmiennej w wiązce plików bezwzględną ścieżką, dla której korzystałem z zamiany sed inplace. ale nie możesz mieć „/” bez zmiany znaczenia w poleceniu. Łączę operacje w bash. Czy nie byłby to najlepszy sposób manipulowania ciągiem w bash?
AxyzB
? Trzy podkreślenia czy jeden?tr '[xyz]'
zastąpi[
i]
też. Argumentem powinna być po prostu lista znaków (chociaż zakresy jaka-z
są w porządku, aw niektórych implementacjach klasy znaków POSIX jak[:digit:]
).Odpowiedzi:
zastąpi każde wystąpienie
x
,y
lubz
z_
, dającA__BC___DEF__LMN
w swoim przykładzie.zastąpiłby powtarzające się wystąpienia
x
,y
alboz
z jednym_
, dającA_BC_DEF_LMN
w swoim przykładzie.źródło
,[]{}()~
znaki. Chcę zastąpić go każdą uciekającą postacią specjalną,'\'
jak mogę to zrobić za pomocą oneshota?gsed
binarnego:$ brew install gnu-sed
wtedy$ gsed -r 's/[xyz]+/_/g'
sed -E
jest (w zasadzie) równoważny zsed -r
wieloma dystrybucjami Linuksa. Jeśli używaszsed 's/[xyz][xyz]*/_/g'
, nie potrzebujesz tej opcji. Oczywiście jest to równoważne,tr -s xyz _
więc nie mased
tu potrzeby .tr
.sed 's/[][{}()~,]/\\&/g'
ale tak naprawdę, zadaj nowe pytanie, jeśli masz pytanie uzupełniające (oczywiście możesz powrócić tutaj tutaj w celu odniesienia). Nawiasem mówiąc,,
i~
nie są regex metaznakami (choć~
zostaje rozszerzona na$HOME
niektórych pozycjach przez bash i niektórych innych powłok; niesh
jednak).Korzystanie z rozszerzenia parametru Bash :
źródło
bash
. Inne powłoki mogą nie działać (choć niektóre będą).sed
jeśli bash ma wbudowane podstawienie?Ten link może być pomocny:
http://tldp.org/LDP/abs/html/string-manipulation.html
Ogólnie,
Aby zamienić pierwsze dopasowanie $ substring na $ replace:
Aby zamienić wszystkie dopasowania $ substring na $ replace:
EDYCJA: Zauważ, że dotyczy to zmiennej o nazwie $ string.
źródło
^ użyj ich tyle, ile potrzebujesz, i możesz wykonać własne szyfrowanie BASIC
źródło
Oto rozwiązanie z rozszerzaniem parametrów powłoki, które zastępuje wiele ciągłych wystąpień jednym
_
:Zauważ, że wzorzec wymaga rozszerzonego dopasowywania wzorca, włączony przy pomocy
+(pattern)
Alternatywnie, z
-s
opcją („ściśnij”)tr
:źródło