разбор пар значений, разделенных двоеточием, с символами двоеточия в поле(ях) [закрыто]

Основная проблема в вашем скрипте заключается в том, что i принимает в качестве значений фактические имена файлов, а j — это просто число. Взятие имен в массив и использование i и j в качестве индексов должно работать:

files=(*)
count=${#files[@]}
for (( i=0 ; i < count ;i++ )); do 
    for (( j=i+1 ; j < count ; j++ )); do
        if diff -q "${files[i]}" "${files[j]}"  >/dev/null ; then
            echo "${files[i]} and ${files[j]} are the same"
        fi
    done
done

(Кажется, работает с Bash и ksh/ksh93 Debian имеет.)

Назначение a=(this that) инициализирует массив a двумя элементами this и то (с индексами 0 и 1). Разделение слов и подстановка работают как обычно, поэтому files=(*) инициализирует files именами всех файлов в текущем каталоге (кроме dotfiles). "${files[@]}" расширится до всех элементов массива, а знак решетки запрашивает длину, поэтому ${#files[@]} — это количество элементов в массиве. (Обратите внимание, что ${files} будет первым элементом массива, а ${#files} — это длина первого элемента, а не массива!)

for i in `/folder/*`

Обратные кавычки здесь наверняка опечатка? Вы бы запустили первый файл как команду, а остальные предоставили бы ей в качестве аргументов.

0
12.05.2019, 23:34
4 ответа

GNU awk может обрабатывать поля как последовательности экранированных символов или не -двоеточия -или -символов обратной косой черты (см. этот ответ ), поэтому следующее должно работать. Не очень эффективное, но хотя бы решение...

#!/bin/bash
line="WiFi:00\:0A\:97\:6F\:7B\:AC:165:5660 MHz:15:"
# line=`nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -t dev wifi`
for i in 1 2 3 4 5; do
    echo $line | gawk -v FPAT='(\\\\.|[^\\\\:])*' '{print $'$i'}' 
done
1
28.01.2020, 02:13

Perl позволяет создавать разделитель полей с просмотром назад -, а также удобно предоставляет модуль JSON . Таким образом, вы можете сделать что-то вроде

nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -t dev wifi | 
  perl -F'(?<!\\):' -MJSON=encode_json -lne 'print encode_json([map { s/\\:/:/g ; $_ } @F])'

Тестирование на вашем примере nmcliвывод:

printf 'WiFi:00\:0A\:97\:6F\:7B\:AC:165:5660 MHz:15:' | 
  perl -F'(?<!\\):' -MJSON=encode_json -lne 'print encode_json([map { s/\\:/:/g ; $_ } @F])'
["WiFi","00:0A:97:6F:7B:AC","165","5660 MHz","15"]
2
28.01.2020, 02:13

Использование sedдля очистки данных иmlrдля преобразования их в JSON:

h='SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY'
nmcli -f $h -t dev wifi | 
sed 's/^:/"",/;s/\([^\]\):/\1,/g;s/[\]:/:/g' | 
mlr --c2j --jvstack  --jlistwrap  label $h

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

{
  "SSID": "FooBarBaz",
  "BSSID": "13:F6:8C:56:9B:3B",
  "CHAN": 36,
  "FREQ": "5180 MHz",
  "SIGNAL": 20,
  "SECURITY": "WPA1 WPA2"
},
2
28.01.2020, 02:13

Несколько заметок здесь:

  • Вы можете предотвратить выход nmcliиз поля с помощью--escape/-e no
  • Имена полей json не нужно заключать в кавычки (без специальных символов)
  • SSIDи Securityне всегда возвращаются, поэтому я добавил заполнитель(--)

    printf '%s' "$(nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -e no -t dev wifi)" |
      jq -sR 'split("\n") |
        map(split(":") |
        {SSID: (if.[0] == "" then "--" else.[0] end), 
          BSSID:.[1:6] | join(":"),
          CHAN:.[7],
          FREQ:.[8],
          SIGNAL:.[9],
          SECURITY: (if.[10]  == "" then "--" else.[10] end)})'
    
3
28.01.2020, 02:13

Теги

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