대괄호로 묶이고 쉼표로 구분된 데이터를 추출합니다.

대괄호로 묶이고 쉼표로 구분된 데이터를 추출합니다.

다음과 같은 데이터가 있습니다.

['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom5/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom6/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom7/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom8/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom9/']

각 줄의 각 값을 따옴표 없이 사용하여 다른 명령으로 파이프할 수 있기를 원합니다. 예를 들면 다음과 같습니다.

/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/
/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/
....

awk -F'[][]' '{print $2}'대괄호를 제거하세요. 더 이상 진행하는 방법을 이해하지 못합니다.

ベストアンサー1

선행 [', 후행을 제거 ']하고 ', '모든 것을 줄 바꿈으로 바꾼 다음 []빈 문자열 목록을 나타내는 데 사용되는 또는 행을 제거할 수 있습니다(접두사는 배열이 문자열 배열임을 지정함).@as []gsettings@asas

gsettings get some-path some-array-key... |
  sed "/^@as \[\]\$/d
       /^\[\]\$/d
       s/^\['//
       s/'\]\$//
       s/', '/\\
/g"

GNU를 사용하면 sed위의 마지막 명령에서 대체된 개행 문자는 리터럴 개행 문자가 뒤에 오는 대신 다음 s과 같이 표현될 수 있습니다 .\n\

빈 목록 과 해당 접두사 '...'대신 유효한 JSON 배열이 되면 다음과 같이 할 수도 있습니다."..."@as

gsettings get some-path some-array-key |
  sed "y/'/\"/; s/^@as //" |
  jq -r '.[]'

gsettings다음과 같이 수행할 수 있는 이스케이프를 고려하지 않기 때문에 이들 중 어느 것도 임의의 문자열 배열에서 작동하지 않습니다.

$ gsettings list-recursively  | grep '\\'
org.freedesktop.ibus.panel.emoji favorites ['\u200b']
org.gnome.evolution.shell filename-illegal-chars "'\"&`();|<>$%{}!"

"..."( 문자열 값에 가 포함된 마지막 사례 로 전환되어 '이 경우 적절한 JSON 문자열이 되는 것을 볼 수도 있습니다 ).

$ gsettings set org.gnome.seahorse last-search-text $'\1\xa\U10FFFF\'\"\\'
$ gsettings get org.gnome.seahorse last-search-text
"\u0001\n\U0010ffff'\"\\"

형식은 설명의 형식인 것 같습니다.https://developer-old.gnome.org/glib/stable/gvariant-text.html

JSON:PP perl모듈은 작은따옴표 구분 기호를 사용하여 JSON 문자열을 지원하므로 다음과 같이 GVariant 개체에서 작은따옴표 또는 큰따옴표로 묶인 문자열을 추출하고 디코딩하는 데 사용할 수 있습니다.

gsettings any-path any-key |
  perl -C -MJSON::PP -lne '
    BEGIN{
      $j = JSON::PP->new->allow_singlequote
    }
    print $j->decode($_) for
      /'\''(?:\\.|[^\\'\''])*'\''|"(?:\\.|[^\\"])*"/g'

정규식은 '...'OR "..."(따옴표 또는 백슬래시의 내부 이스케이프 허용) 쌍을 찾아 이를 JSON 디코더에 전달합니다. JSON:PP를 무시하면 AFAICT, 바이트 문자열이 차단 b'...'되고 .b"..."gsettings[byte 0xHH, 0xHH...]

おすすめ記事