Uruchamiam to polecenie w powłoce bash na Ubuntu 12.04.1 LTS. Usiłuję usunąć zarówno znaki, jak [
i ]
znaki za jednym zamachem, tj. Bez konieczności odpuszczania po raz drugi.
Wiem, że nawiasy kwadratowe mają specjalne znaczenie w wyrażeniu regularnym, więc uciekam od nich, poprzedzając je odwrotnym ukośnikiem. Spodziewałem się tylko sznurka, 123
ale nawiasy kwadratowe pozostają i chciałbym wiedzieć, dlaczego!
~$ echo '[123]' | sed 's/[\[\]]//'
[123]
str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
Odpowiedzi:
Jest to łatwe, jeśli dokładnie przestrzegasz instrukcji : wszyscy członkowie klasy postaci tracą specjalne znaczenie (z kilkoma wyjątkami). I] traci swoje specjalne znaczenie, jeśli zostanie umieszczone na liście jako pierwsze . Próbować:
To mówi:
]
i[
//
,g
.Ponownie,
]
musi być pierwszy w klasie, ilekroć jest uwzględniony.źródło
Nie jestem pewien, dlaczego to nie działa, ale to działa:
albo to:
Możesz także wypróbować inne podejście i dopasować ciąg znaków w nawiasach (zakładając, że łańcuch można łatwo dopasować i nie jest zdefiniowany w nawiasach):
Mam takie same problemy z używaniem oryginalnego wyrażenia regularnego,
grep
więc podejrzewam, że to nie tylkosed
sprawa.Dziwnie, dają różne wyniki, ale jeden z nich pasuje do tego, co chcesz:
Zastosowanie tego do oryginału
sed
(i dodanie/g
modyfikatora, aby usunął oba nawiasy):źródło
tr
:echo '[123]' | tr -d '[]'
- pozwala uniknąć nieporozumień wyrażeń regularnych dotyczących ucieczki.tr
może to przetłumaczyć tylko jeden znak na raz, ale się myliłem. Dzięki!Aby usunąć wszystko przed i po nawiasach:
Jeśli Twoje dane są takie, zawsze oznacza to rozpoczynanie i kończenie na nawiasach kwadratowych:
źródło
Jeśli masz bardziej złożony ciąg, np. „Abcdef [123] ghijk”, możesz również użyć wewnętrznego polecenia bash „cut”, aby wyodrębnić tekst tylko w nawiasach kwadratowych:
źródło
Możesz uciec z klamry otwierającej za pomocą
\[
. Do klamry zamykającej użyj[]]
.źródło