Вывести сопоставленный шаблон без подстановки с помощью утилиты SED - PullRequest
0 голосов
/ 31 мая 2018

Этот вопрос относится к Удалите сетевой профиль из wpa_supplicant.conf в Linux (raspbian).

Используя следующую команду, мы можем увидеть вывод в виде содержимого файла с соответствующимСетевой блок SSID удален.

cat network_block_eg.conf | sed -n '1 !H;1 h;$ {x;s/[[:space:]]*network={\n[[:space:]]*ssid="example"[^}]*}//g;p;}'

Вопрос в том, как получить выходные данные в виде совпадающего шаблона (в данном случае network = {}).

Например, команда должна вывести

network={
    ssid="example"
    proto=WPA
    key_mgmt=WPA-PSK
    pairwise=TKIP
    group=TKIP
    psk="not so secure passphrase"
    wpa_ptk_rekey=600
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

sed - для простых замен в отдельных строках, s/old/new/, , то есть все .Во всем остальном вы должны использовать awk, так как все эти сумасшедшие конструкции sed делают больше, чем это устарело в середине 1980-х годов, когда был изобретен awk.

Трудно сказать без краткого, тестируемого образца ввода и ожидаемого результата, ноучитывая этот пример ввода (из https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf):

$ cat file
# Default LLT value for this interface in milliseconds. The value used in case
# no value provided during session setup. Default is 50 msec.
# fst_llt is in 1..4294967 range (due to spec limitation, see 10.32.2.2
# Transitioning between states).
#fst_llt=100

# Example blocks:

# Simple case: WPA-PSK, PSK as an ASCII passphrase, allow all valid ciphers
network={
        ssid="simple"
        psk="very secret passphrase"
        priority=5
}

# Same as previous, but request SSID-specific scanning (for APs that reject
# broadcast SSID)
network={
        ssid="second ssid"
        scan_ssid=1
        psk="very secret passphrase"
        priority=2
}

# Only WPA-PSK is used. Any valid cipher combination is accepted.
network={
        ssid="example"
        proto=WPA
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
        priority=2
}

То, о чем вы, похоже, просите, будет так просто:

$ awk -v RS= -v ORS='\n\n' '/ssid="example"/' file
# Only WPA-PSK is used. Any valid cipher combination is accepted.
network={
        ssid="example"
        proto=WPA
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
        priority=2
}

, а в противном случае будет просто отрицатьсятест для /ssid="example"/:

$ awk -v RS= -v ORS='\n\n' '!/ssid="example"/' file
# Default LLT value for this interface in milliseconds. The value used in case
# no value provided during session setup. Default is 50 msec.
# fst_llt is in 1..4294967 range (due to spec limitation, see 10.32.2.2
# Transitioning between states).
#fst_llt=100

# Example blocks:

# Simple case: WPA-PSK, PSK as an ASCII passphrase, allow all valid ciphers
network={
        ssid="simple"
        psk="very secret passphrase"
        priority=5
}

# Same as previous, but request SSID-specific scanning (for APs that reject
# broadcast SSID)
network={
        ssid="second ssid"
        scan_ssid=1
        psk="very secret passphrase"
        priority=2
}

Если это не то, что вы хотите, отредактируйте ваш вопрос, чтобы предоставить пример ввода и ожидаемый результат, который проясняет ваши требования, и мы можем проверить, чтобы мы могли предоставить другой, но все еще ясныйи тривиальное решение awk.

0 голосов
/ 31 мая 2018
cat network_block_eg.conf | sed -n '/[[:space:]]*network={/ {:a; /}/! {N; ba;}; /ssid="example"/ p}'

Объяснение команды Sed, -n подавить нормальный вывод:

/[[:space:]]*network={/ { # in a line that matches start block pattern
  :a                      # 'a' label to jump to
  /}/! {                  # if pattern space not contains end block pattern
    N                     # read next line and add it to pattern space
    ba                    # jump back to 'a' label
  }
  /ssid="example"/ p      # now if pattern space contains your desired ssid, print it out
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...