Как заменить [] скобки с помощью 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