Поиск динамического паттерна в файле и замена его на переменные

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

С помощью zsh вы можете сделать это следующим образом:

stdbuf -oL showkey -s | while read line
do
  if [[ "$line" =~ '^0x' ]]
  then
    for code in ${(z)line}
    do
      printf "0%o " $code
    done
    echo
  else
    echo $line
  fi
done

stdbuf является частью GNU coreutils и может использоваться для изменения операций буферизации в стандартных потоках. Вызывается с помощью -oL , он настраивает stdout на строчную буферизацию. Это необходимо сделать для того, чтобы выходные данные команды showkey -s проходили сразу же по конвейеру построчно. В противном случае вывод будет передаваться только при заполнении буфера (обычно несколько килобайт) или выходе из программы.

Выходные данные передаются по конвейеру в цикл while , который считывает каждую строку в переменную строку , пока конвейер не закроется.Если строка начинается с 0x (соответствует регулярному выражению '^ 0x'), каждое шестнадцатеричное число ( $ {(z) param} разбивает строку на слова, такие как zsh разделит командную строку) преобразуется в восьмеричное (на самом деле шестнадцатеричное число неявно преобразуется оболочкой в ​​десятичное, а затем форматируется как восьмеричное с помощью printf ). Если строка не начинается с 0x , распечатайте ее как есть.


Вы также можете использовать perl :

stdbuf -oL showkey -s | perl -e '
  while(<STDIN>){
    if(/^0x/){ 
      printf "0%o ", hex($_) for split; 
      print $/;
    } else { 
      print 
    }
  }'

Применяется тот же принцип.

1
23.02.2019, 12:29
3 ответа

Если и только если значения на самом деле буквенно-цифровые и вхождения этих строк должны все быть заменены в файле, это должно работать (непроверено):

sed -i -e "s/0875642139/${C}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg/${A}${B}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg0875642139/${A}${B}${C}/" package.sql
0
28.01.2020, 00:19
grep TRANSLATE p.sql
| sed -E 's_translate\("(.*)","(.*)"\);_"s/\1/\2/"_' \
# e.g. match the line, and create a sed replacement  "s/012/210/"
| xargs -I% sed -i -e "%" file

Я думаю, что вам нужно использовать группировку регулярных выражений.

Вы можете очень точно указать, что вы сопоставляете, а затем включить большую часть этого в вывод по ссылке.

sed 's#(common_str[(][keep class 0-9]+",")[replace class]+#\1replacement str#'

sed 's#
(common_str[(][keep class 0-9]+",")[replace class]+
#
\1replacement str
#'`
0
28.01.2020, 00:19

Вы можете следовать подходу (оболочка bash)

Сначала создайте переменные с соответствующими именами, сгенерированные переменные и их перемешанные аналоги.

Затем выполните команду sed.

num=`LC_ALL=C printf '%s' {0..9}`
A2Z=`LC_ALL=C printf '%s' {A..Z}`
a2z=`LC_ALL=C printf '%s' {a..z}`

 alpha=${A2Z}${a2z}
alnum=${alpha}${num}

 num_shuf=`echo "$num" | fold -w 1 | shuf | tr -d "\n"`
 alpha_shuf=`echo "$alpha" | fold -w 1 | shuf | tr -d "\n"`
 alnum_shuf=`echo "$alnum" | fold -w 1 | shuf | tr -d "\n"`

 sed -e "
    /TRANSLATE/! b

    # numeric
    /,'$num',/ s/'[^']*'/,'$num_shuf'/2

    # alphabetic
    /,'$alpha',/ s/,'[^']*'/,'$alpha_shuf'/2

    # alphanumeric
    /,'$alnum',/ s/,'[^']*'/,'$alnum_shuf'/2
 " input.sql
0
28.01.2020, 00:19

Теги

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