Как заменить [] скобки с помощью SED

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

Я начал с

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

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

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

в любом случае это то, что я в настоящее время имею и хотел бы добавить [] to.

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

кстати, я использую KSH на Solaris, Redhat & HP

5 ответов


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

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

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

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


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

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

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

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

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

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

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


вот окончательный код, который я закончил с

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

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


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

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

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