Извлечение жетонов из строки текста

Используя скрипты bash и grep / awk / sed, как я могу разделить строку, соответствующую известному шаблону, с одним разделителем символов в массив, например, преобразовать token1;token2;token3;token4 в a[0] = token1a[3]=token4 ?

  • Как sed заменить этот конец линии?
  • Сортировка одного файла по строке на основе другого файла
  • Вставьте новые строки с отсутствующими значениями (NA)
  • Сокращение порядка и вывод текста
  • sed + удалить слово из определенной строки
  • Использование 'sed' для поиска и замены
  • Как заменить слово внутри файла .DOCX с помощью командной строки Linux?
  • Как мне искать файл для строки, а затем использовать его как переменную?
  • 3 Solutions collect form web for “Извлечение жетонов из строки текста”

    ОБНОВЛЕНИЕ Учтите, что создание массива таким образом подходит только тогда, когда IFS является одним символом без пробелов, и в строке данных нет последовательных разделителей.
    Для решения этой проблемы и аналогичного решения перейдите к этому вопросу Unix & Linux … (и стоит просто прочитать, чтобы получить больше информации о IFS.


    Используйте bash (и другие POSIX-оболочки, например, ash, ksh, zsh) IFS (Internal Field Seperator).

    Использование IFS позволяет избежать внешнего вызова и просто позволяет встраивать пробелы.

     # ============== A='token0:token1:token2.y token2.z ' echo normal. $A # Save IFS; Change IFS to ":" SFI=$IFS; IFS=: ##### This is the important bit part 1a set -f ##### ... and part 1b: disable globbing echo changed $A B=($A) ### this is now parsed at : (not at the default IFS whitespace) echo B...... $B echo B[0]... ${B[0]} echo B[1]... ${B[1]} echo B[2]... ${B[2]} echo B[@]... ${B[@]} # Reset the original IFS IFS=$SFI ##### Important bit part 2a set +f ##### ... and part 2b echo normal. $A # Output normal. token0:token1:token2.y token2.z changed token0 token1 token2.y token2.z B...... token0 B[0]... token0 B[1]... token1 B[2]... token2.y token2.z B[@]... token0 token1 token2.y token2.z normal. token0:token1:token2.y token2.z 

    Существуют два основных подхода. Один из них – IFS , продемонстрированный fred.bear . Это имеет то преимущество, что не требует отдельного процесса, но может быть сложно получить право, когда на вашем входе могут быть символы, имеющие особое значение для оболочки. Другой подход заключается в использовании утилиты обработки текста. Разделение поля встроено в awk .

     input="token1;token2;token3;token4" awk -vinput="$input" 'BEGIN { count = split(input, a, ";"); print "first field: " a[1]; print "second: field" a[2]; print "number of fields: " count; exit; }' 

    Awk особенно подходит при обработке нескольких входов.

     command_producing_semicolon_separated_data | awk -F ';' '{ print "first field: " $1; print "second field: " $2; print "number of fields: " NF; }' 
     $ str="token1;token2;token3;token4" $ echo $str token1;token2;token3;token4 $ echo $str | tr ';' ' ' token1 token2 token3 token4 $ arr=( $(echo $str | tr ';' ' ') ) # Populate the tokens into an array $ echo ${arr[0]} # Access items by index token1 $ echo ${arr[2]} token3 $ echo ${arr[1]} token2 $ echo ${#arr[@]} # Length of the array 4 
    Linux и Unix - лучшая ОС в мире.