Как заменить каждую цифру после специального символа «$» на «*»

Моя вкладка Gmail закреплена и остается первой. Этот небольшой скрипт помогает мне

#!/bin/bash                                                                                                              

wmctrl -a $1                                                                                                             
xdotool search --onlyvisible --class $1 key Alt+1

./activate_mail.sh Chromium
./activate_mail.sh Firefox

Это работает в моей среде i3wm.

0
17.11.2020, 20:58
4 ответа

Сperl

$ perl -pe 's/\$\K\d+/$&=~s|.|*|gr/ge' ip.txt
axbnx $** ghjas $**$
axbnx $*** ghjas $ 
axbnx $*** ghjas $$*** 
  • \$\K\d+совпадение цифр, которым предшествует символ $(\K, предотвратит $от того, чтобы быть частью совпадающей части в$&)
  • $&=~s|.|*|grзаменить каждый символ совпадающей части на*
  • eфлаг, разрешающий использование кода Perl в секции замены

Вы также можете использоватьperl -pe 's/\$\d+/$&=~tr|0-9|*|r/ge'

2
18.03.2021, 22:49

Следующая программа awkбудет последовательно заменять цифры в шаблоне «$, за которыми следует одна или несколько цифр» на*:

awk '{do {$0=gensub(/(\$\**)[[:digit:]]/,"\\1*","g");} while ($0~/\$\**[[:digit:]]/)}1' input.txt

Это достигается путем замены шаблона "$, за которым следует ноль или более *и затем одна цифра" на "все до цифры, а затем единица *" (вызов gensub())и циклически до тех пор, пока не останется ни одного вхождения шаблона поиска.

Синтаксис в вызове gensub()предписывает awkискать шаблон $, ноль или более *и одну цифру и сохранять все до цифры (, которая заключена в круглые скобки )в «группу захвата». В заменяющем тексте для этого шаблона эта «группа захвата» упоминается как \\1и копируется как -, но цифра опускается и вместо нее заменяется литерал *.

1
18.03.2021, 22:49

с корректировкой небольшого изменения в моем ответе на ваш ранее заданный вопрос , изменив[^*](не -символ звезды )на [0-9]цифру, вы могли бы сделать:

sed -E ':a s/(\$\**)[0-9]/\1*/; ta' infile

Я не уверен, что если вы хотите сохранить такие шаблоны, как $***123, от преобразования или не так, как указано в комментарии, но чтобы предотвратить это, вы можете изменить первый символ после $для этих шаблонов на что-то вроде $<Uniq-character-or-string>*затем измените остальные паттерны и верните этот паттерн обратно в предыдущее состояние с помощью:

sed -E ':a s/\$\*/$Uniq*/;ta;
        :b s/(\$\**)[0-9]/\1*/; tb;
        :c s/\$Uniq\*/$*/; tc;
' infile
2
18.03.2021, 22:49

С GNU awk для соответствия третьего аргумента ()и gensub():

$ awk '{while ( match($0,/(.*)(\$[0-9]+)(.*)/,a) ) $0=a[1] gensub(/[0-9]/,"*","g",a[2]) a[3]} 1' file
axbnx $** ghjas $**$
axbnx $*** ghjas $
axbnx $*** ghjas $$***
2
18.03.2021, 22:49

Теги

Похожие вопросы