Как заменить [] скобки, используя SED

У меня есть строка, из которой я хочу удалить пунктуацию.

Я начал с

sed 's/[[:punct:]]/ /g'

Но у меня были проблемы с HP-UX, которые мне не нравились все время, а иногда я получал 0 и ничего после того, как $ в моей строке исчезнет. Поэтому я решил попробовать сделать это вручную.

У меня есть следующий код, который работает во всех моих пунктуациях, которые меня интересуют, за исключением того, что я не могу добавить квадратные скобки "[]" к моему sed с чем-либо еще, иначе он ничего не заменит, и я не получу ошибка, поэтому я не уверен, что исправить.

В любом случае, это то, что я сейчас имею, и хотел бы добавить [] в.

sed 's/[-=+|[email protected]#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g'

BTW Я использую KSH для Solaris, Redhat и HP

Ответ 1

Вот окончательный код, в который я попал

`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'`

Мне пришлось поставить = и - в самом конце.

Ответ 2

Вам нужно разместить скобки в начале выражения:

sed 's/[][=+...-]/ /g'

Поместив ']' в качестве первого символа сразу после открывающей скобки, он интерпретируется как член набора символов, а не закрывающая скобка. Размещение '[' в любом месте скобок делает его членом набора.

Для этого набора символов вам также необходимо иметь дело с - специально, так как вы не пытаетесь создать диапазон символов между [ и =. Поэтому поставьте - в конце класса.

Ответ 3

Вы также можете указать символы, которые вы хотите сохранить [с инверсией]:

sed 's/[^a-zA-Z0-9]/ /g'

Ответ 4

Вы можете сделать это вручную:

sed 's/[][\/$*.^|@#{}~&()_:;%+"='\'',`><?!-]/ /g'

Это удаляет 32 символа пунктуации, порядок некоторых символов важен:

  • - должен быть в конце как -]
  • [] должен быть таким, как [][other characters]
  • ' следует экранировать как '\''
  • не начинайте с ^, как в [^
  • не начинаться с [. [= [: и заканчиваться на .] =] :]
  • не заканчивается $]

здесь вы можете объяснить, почему все это http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03

Ответ 5

Может обрабатываться с использованием техники захвата регулярных выражений (например: здесь ниже):

echo "narrowPeak_SP1[FLAG]" | sed -e 's/\[\([a-zA-Z0-9]*\)\]/_\1/g'
> narrowPeak_SP1_FLAG

\[ : literal match to open square bracket, since [] is a valid regex
\] : literal match to square close bracket
\(...\) : capture group
\1 : represents the capture group within the square brackets