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

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

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

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

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

 - Hello World - Earth 

Вывод:

 - XXX - XXX 

Желаемая:

 - XXXXXXXXXX - XXXXX 

  • Извлечение определенных строк набора, соответствующих правилу
  • Замена шаблона в строке, предшествующей другому интересующему образцу
  • Как вы можете объединить все строки, которые заканчиваются символом обратной косой черты?
  • Как присоединиться к строкам vCards
  • Как удалить строки, соответствующие foo, но не соответствующие строке?
  • регулярное выражение шаблона для правила перезаписи apache
  • исключить строки из файла на основе определенных значений в определенных столбцах
  • Возврат результата из Perl Regex
  • 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:]] ) в соответствии с вашими потребностями.

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