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

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

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

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

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

 - Hello World - Earth 

Вывод:

 - XXX - XXX 

Желаемая:

 - XXXXXXXXXX - XXXXX 

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:]] ) в соответствии с вашими потребностями.

  • Поиск текста между двумя конкретными символами или строками
  • Помогите с пониманием регулярного выражения
  • Команда командной строки для добавления пробела к регулярному выражению
  • Удаление повторяющихся слов между скобками inline
  • Изменение существующего файла непосредственно для замены «foo» на «bar» ТОЛЬКО для строк, содержащих «baz»,
  • Возврат результата из Perl Regex
  • Regex, который будет grep-номера после определенной строки
  • захватить текст по шаблону с началом и конечным тегом в нескольких строках
  • Извлечение определенных строк набора, соответствующих правилу
  • Как извлечь сходство между двумя строками
  • Замена шаблона в строке, предшествующей другому интересующему образцу
  • Как присоединиться к строкам vCards
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.