Текст цензора с регулярным выражением

В настоящее время я выполняю эту команду для цензуры списка отступов.

sed -e 's/\(\s\+- \)\(.*\)/\1XXX/g' 

Это здорово, за исключением того, что я хотел бы, чтобы число X s соответствовало количеству совпадающих символов. Как мне это сделать? Правильный способ особо не требует использования sed.

Ввод текущего примера:

 - Hello World - Earth 

Вывод:

 - XXX - XXX 

Желаемая:

 - XXXXXXXXXX - XXXXX 

  • Расширение списка, разделенного запятыми, на отдельные строки
  • Извлечение подмножества строк файла на основе регулярного выражения для первой и последней строки
  • Помогите с пониманием регулярного выражения
  • исключить строки из файла на основе определенных значений в определенных столбцах
  • Как удалить строки, соответствующие foo, но не соответствующие строке?
  • Удалить все до «/» на каждой строке
  • Изменение существующего файла непосредственно для замены «foo» на «bar» ТОЛЬКО для строк, содержащих «baz»,
  • Извлечение определенных строк набора, соответствующих правилу
  • 3 Solutions collect form web for “Текст цензора с регулярным выражением”

    Решение Perl:

     perl -pe 's/^( *- )(.+)/$1."X"x length($2)/e' 

    Это использует "X" x length($2) чтобы получить правильное количество X s в замене.

    Вход теста:

     - Hello World - Earth This is not - censored 

    вывод:

     - XXXXXXXXXXX - XXXXX This is not - censored 
     $ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0)}1' <<EOM - Hello - World 2015 This is not - censored EOM - XXXXX - XXXXX XXXX This is not - censored 

    Выражение awk ищет любые строки, начинающиеся с символа – после опциональных пробелов. Для сопоставления строк команда gsub() заменяет все символы, за исключением пробелов и символа - . Финал 1 – это просто ярлык для {print $0} , то есть для повторной печати всей строки.

    edit : Так как вам также требуется удалить / заменить символы пробела с помощью X тоже, я не могу думать о более элегантном решении, кроме как сделать дополнительную замену:

     $ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0);gsub(/XX/,"XXX",$0)}1' <<EOM - Hello World - Earth This is not - censored EOM - XXXXXXXXXXX - XXXXX This is not - censored 

    Вы можете сделать это и с sed :

     sed '/^[[:blank:]]*-[[:blank:]]/{ h s/// s/./X/g x s/\([[:blank:]]*-[[:blank:]]\).*/\1/ G s/\n// }' infile 

    Это копирует строку поверх h старого буфера, удаляет первую часть [[:blank:]]*-[[:blank:]] , заменяет оставшиеся символы X , затем e x меняет шаблон / удержание, поэтому теперь строка с цензурой находится в шаблоне удержания, а исходная строка возвращается в пространство шаблона. Вторая часть строки удаляется с помощью s/\(...\).*// , строка в пространстве удержания добавляется к пространству шаблонов ( G ) и удаляется символ \n ewline. Итак, с файлом вроде:

     - line here not - to be modified - abcde - another line-here 

    выход:

     - XXXXXXXXX not - to be modified - XXXXXXXXX - XXXXXXXXXXXXXXXXX 

    Если вы хотите удалить пустые символы и заменить только непустые на X :

     sed '/^[[:blank:]]*-[[:blank:]]/{ h s/// s/[[:blank:]]//g s/./X/g x s/\([[:blank:]]*-[[:blank:]]\).*/\1/ G s/\n// }' infile 

    вывод:

     - XXXXXXXX not - to be modified - XXXXX - XXXXXXXXXXXXXXXX 

    или, в одной строке с gnu sed :

     sed -E '/^[ \t]*-[ \t]/{h;s///;s/[ \t]//g;s/./X/g;x;s/([ \t]*-[ \t]).*/\1/;G;s/\n//}' infile 

    Отрегулируйте регулярное выражение (т.е. ^[[:blank:]]*-[[:blank:]] ) в соответствии с вашими потребностями.

    Interesting Posts

    Какое выражение / логику нужно добавить в скрипт, который проверяет журнал, который меняется каждый день, поскольку он имеет встроенную в него дату

    Отключить отображение меню grub на ЖК-дисплее и отобразить только на последовательной консоли

    выполнить команду из find, вызванной find

    Создание произвольно большого «поддельного» файла

    Безопасно ли удалить файл /etc/hosts.deny?

    Добавление badblocks на смонтированном разделе

    Безопасно ли запускать инструменты GPG в x11?

    -fstack-protector-strong доступен, но компилятор разбивается при компиляции ядра с использованием gcc

    Чтение содержимого в строке в bash

    Создание самбы, нетаталка и авахи (bonjour) на малине pi

    Как добраться до редактора nm-connection из GUI в GNOME 3?

    Не удается получить доступ к моему устройству через SSH через Интернет

    Эффективная генерация stdin в сценарии оболочки

    Как я удаляю все файлы в каталоге с конкретными расширениями, за исключением последних 5 из них

    Каковы эти прямоугольные символы и где обозначаются эти обозначения

    Linux и Unix - лучшая ОС в мире.