Как я могу удалить хэши из строки? - PullRequest
0 голосов
/ 19 мая 2010

Я хочу преобразовать строку, которая выглядит следующим образом:

any text #any text# ===#text#text#text#===#

в

any text #any text# ===#texttexttext===#

Как вы можете видеть выше, я хочу удалить # между === # и === # Число #, которое должно быть удалено, может быть любым числом.

Могу ли я сделать это с помощью sed?

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Попробуйте:

sed 'h;s/[^=]*=*=#\(.*\)/\1/;s/\([^=]\)#/\1/g;x;s/\([^=]*=\+#\).*/\1/;G;s/\n//g' inputfile

Он разбивает строку на две сначала "= #", затем удаляет все "#", которым не предшествует "=", затем объединяет строки

Дайте мне знать, если есть конкретные случаи, когда он терпит неудачу.

Edit:

Эта версия, которая становится все более хрупкой, работает как для вашего нового примера, так и для оригинала:

sed 'h;s/[^=]*=[^=]*=*=#\(.*\)$/\1/;s/\([^=]\)#/\1/g;x;s/\([^=]*=[^=]*=\+#\).*/\1/;G;s/\n//g' inputfile
1 голос
/ 19 мая 2010

sed использует движок GNU BRE (базовые регулярные выражения GNU), который не имеет многих функций, которые есть у «более новых» движков регулярных выражений, таких как lookaround, который очень удобен для решения этой проблемы.

Я бы сказал, что вам нужно сначала сопоставить ===#\(.\+\)===# (обратите внимание, что GNU BRE использует обратную косую черту для обозначения групп захвата и квантификаторов, а также не поддерживает отложенные квантификаторы). Затем удалите все #, найденные в захваченной группе (достаточно буквального поиска / замены), а затем поместите результат обратно в строку. Но я не парень из Unix, так что я не знаю, можно ли это сделать в sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...