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
}
}'
Применяется тот же принцип.
Если и только если значения на самом деле буквенно-цифровые и вхождения этих строк должны все быть заменены в файле, это должно работать (непроверено):
sed -i -e "s/0875642139/${C}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg/${A}${B}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg0875642139/${A}${B}${C}/" package.sql
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
#'`
Вы можете следовать подходу (оболочка 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