$ echo '[4251][7c3c]' | tr -d '[]' | tr '[:lower:]' '[:upper:]' | cut -c 3-
517C3C
Как функция:
decodeSerial () {
printf '%s\n' "$1" |
tr -d '[]' |
tr '[:lower:]' '[:upper:]' |
cut -c 3-
}
Конвейер удаляет все символы [
и ]
из ввода, преобразует все символы нижнего регистра -в верхний регистр -и отбрасывает первые два символа из результата.
С помощью одного вызова sed
(, который предполагает, что буквенные символы являются шестнадцатеричными цифрами, от a
доf
):
$ echo '[4251][7c3c]' | sed 's/[][]//g; y/abcdef/ABCDEF/; s/^..//'
517C3C
Чтобы сохранить последние шесть символов, а не удалять первые два, этот вызов sed
можно изменить на
sed 's/[][]//g; y/abcdef/ABCDEF/; s/^.*\(.\{6\}\)$/\1/'
Использованиеawk
:
$ echo '[4251][7c3c]' | awk '{ gsub("[][]", ""); print toupper(substr($1,3)) }'
517C3C
С помощью команды awk
в вашей функции (команда sed
выше может быть вставлена аналогичным образом):
decodeSerial () {
printf '%s\n' "$1" |
awk '{ gsub("[][]", ""); print toupper(substr($1,3)) }'
}
Использование awk
без конвейера в функции оболочки:
decodeSerial () {
awk -v string="$1" 'BEGIN { gsub("[][]", "", string); print toupper(substr(string,3)) }'
}
Обратите внимание, что ваш синтаксис ${serial: -6}
— это bash
, который может не работать с /bin/sh
.
Сperl
:
$ perl -pe 's/^(@.*)\n/\1/' file
@Abbb
@Bbbb
@Dccc
или
$ perl -pe 's/\n// if /^@/' file
@Abbb
@Bbbb
@Dccc
Нет -Сед
если известно, что все строки чередуются @ и не-@, то
paste -d '' - - < file
авк
awk '{printf "%s%s", $0, (/^@/ ? "" : ORS)}' file
awk '{ printf "%s", (/^@/?(NR>1?ORS:""):"")$0 } END{ print "" }' infile
Пример ввода:
iiii
@A
bbb
xyz
@B
bbb
@D
ccc
Выход:
iiii
@Abbbxyz
@Bbbb
@Dccc