Заменить новые строки в конце строк, начиная с шаблона

$ 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.

3
04.10.2021, 14:08
4 ответа

Perl спешит на помощь!

perl -pe 'chomp if /^@/' -- file
  • -pсчитывает ввод построчно и печатает каждую строку после обработки
  • /^@/соответствует @в начале строки
  • chomp удаляет завершающую новую строку
5
04.10.2021, 14:17

Сperl:

$ perl -pe 's/^(@.*)\n/\1/' file
@Abbb
@Bbbb
@Dccc

или

$ perl -pe 's/\n// if /^@/' file
@Abbb
@Bbbb
@Dccc
2
04.10.2021, 14:19

Нет -Сед

  1. если известно, что все строки чередуются @ и не-@, то

    paste -d '' - - < file
    
  2. авк

    awk '{printf "%s%s", $0, (/^@/ ? "" : ORS)}' file
    
3
04.10.2021, 14:19
awk '{ printf "%s", (/^@/?(NR>1?ORS:""):"")$0 } END{ print "" }' infile

Пример ввода:

iiii
@A
bbb
xyz
@B
bbb
@D
ccc

Выход:

iiii
@Abbbxyz
@Bbbb
@Dccc
1
04.10.2021, 14:21

Теги

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