Удалить двойные кавычки из всех полей массива в bash

Этот массив существует в скрипте bash в минимальной среде linux/posix. Все поля в моем массиве строк заключены в двойные кавычки. Я ищу элегантное решение для удаления символа двойной кавычки в начале и конце каждого поля, так как в поле могут быть двойные кавычки, которые не следует удалять.

Массив является одномерным и содержит следующие поля:

"This is a value, in this element"
"This is also a "value" but has double quotes"
"0X:41:DE:AD:BE:EF; -- EXIT --"

Желаемые значения полей после операции будут следующими:

This is a value, in this element
This is also a "value" but has double quotes
0X:41:DE:AD:BE:EF; -- EXIT --

В настоящее время я безуспешно пробовал следующее:

fields=`sed -e 's/^"//' -e 's/"$//' <<<"${fields[@]}"

ты пробовал echo "${fields[@]}" | tr -d '"'?

Gaurav Pathak 12.04.2023 15:12

Пожалуйста, посмотрите этот ответ: stackoverflow.com/a/26314887/2805824

Gaurav Pathak 12.04.2023 15:14

@GauravPathak, который также удалит кавычки внутри поля.

Ed Morton 12.04.2023 15:32

Да все верно, заметил только заголовок --> убрать двойные кавычки со всех полей

Gaurav Pathak 12.04.2023 17:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
95
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Предполагая, что «в Bash» означает «без внешних процессов», вы можете применять обычные расширения/преобразования Bash к каждому элементу массива. Это дает желаемый результат, например:

fields=('"This is a value, in this element"'
        '"This is also a "value" but has double quotes"'
        '"0X:41:DE:AD:BE:EF; -- EXIT --"')
        
fields=("${fields[@]/#\"}")  # remove leading quotes
fields=("${fields[@]/%\"}")  # remove trailing quotes

printf '%s\n' "${fields[@]}"

Хороший. Вы опередили меня, когда я пытался придумать способ сделать правки таким образом за один проход, но глобусы не являются регулярными выражениями, лол - забавное упражнение, однако.

Paul Hodges 12.04.2023 16:26

«За один проход» было бы возможно, если бы не требование сохранять кавычки, отличные от начальных и конечных. fields=("${fields[@]//\"}") в таком случае удалит все кавычки.

Andrej Podzimek 13.04.2023 14:21

Ага. Единственная проблема здесь в том, что шары всегда привязаны к обоим концам. :)

Paul Hodges 13.04.2023 15:23

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

Вот один из способов улучшить ответ на ваш предыдущий вопрос, чтобы не заполнять массив fields[] окружающими кавычками:

$ cat tst.sh
#!/usr/bin/env bash

while IFS= read -d '' -r record; do
    readarray -d $'\n' -t fields <<< "$record"
    printf '%s\n' "${fields[@]}"
done < <( awk -v ORS='\0' '{gsub(/","/,"\n"); gsub(/^"|"$/,"")} 1' "${@:--}" )

$ ./tst.sh file
AC XA, S.A.
City of Commerce
00
0A348E541E6F5C258A12A5674AEF25F28BA7DCFAECEECC4EE63B71B361606AC3
Included
Included
Included
Not Included
09/30/2003
09/30/2037

SZ=City of Commerce; FE=http://website.org; O=AC XA SA CIF A39201827; C=QR
--BINARY BLOB--maXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAUIC0gMjAxNjESMBAGA1UEBRMJQTgyNzQzMjg3MRgwFgYDVQRhDA9WQVRFUy1BODI3NDMyODcxGzAZBgNVBAoMEkFDIENBTUVSRklSTUEgUy5BLjEnMCUGA1UEAwweR0xPQkFMIENIQU1CRVJTSUdOIFJPT1QgLSAyMDE2MB4XDTE2MDQxNDA3NTAwNloXDTQwMDQwODA3NTAwNlowggEIMQswCQYDVQQGEwJFUzEPMA0GA1UECAwGTUFEUklEMQ8wDQYDVQQHDAZNQURSSUQxOjA4BgNVBAsMMXNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MxJzAlBgNVBAsMHkdMT0JBTCBDSEFNQkVSU0lHTiBST09UIC0gMjAxNjESMBAGA1UEBRMJQTgyNzQzMjg3MRgwFgYDVQRhDA9WQVRFUy1BODI3NDMyODcxGzAZBgNVBAoMEkFDIENBTUVSRklSTUEgUy5BLjEnMCUGA1UEAwweR0xPQkFMIENIQU1CRVJTSUdOIFJPT1QgLSAyMDE2MIICIjANBgkqhkiG9w0BAQEF--END--
SZ1qSRW
Email
AFX Client;Email
AFX Method;AFX Method;Entry Point;AFX Email;Time Stamping
No Entry

Мы добавляем readarray сейчас, так как мы не можем заполнять fields[] напрямую во время чтения в этом случае, поскольку пустое поле приведет к обратным \ns, а когда IFS установлен на символ пробела, такой как \n, read использует непрерывные появления этого символа в качестве одного разделителя, поэтому пустые поля будут пропущены.

возможно, mapfile плюс sed:

fields=('"This is a value, in this element"'
        '"This is also a "value" but has double quotes"'
        '"0X:41:DE:AD:BE:EF; -- EXIT --"')

mapfile -t newfields < <(printf "%s\n" "${fields[@]}" | sed 's/^"//;s/"$//')

printf "%s\n" "${newfields[@]}"

This is a value, in this element
This is also a "value" but has double quotes
0X:41:DE:AD:BE:EF; -- EXIT --
#!/bin/bash

fields=('"This is a value, in this element"'
        '"This is also a "value" but has double quotes"'
        '"0X:41:DE:AD:BE:EF; -- EXIT --"')

echo "--> before"
declare -p fields

for i in "${!fields[@]}"
do
    value = "${fields[i]/\"/}"
    value = "${value%"${value##*[!\"]}"}"
    fields[i]=$value
done

echo -e "\n--> after"
declare -p fields

Выход

--> before
declare -a fields=([0] = "\"This is a value, in this element\"" [1] = "\"This is also a \"value\" but has double quotes\"" [2] = "\"0X:41:DE:AD:BE:EF; -- EXIT --\"")

--> after
declare -a fields=([0] = "This is a value, in this element" [1] = "This is also a \"value\" but has double quotes" [2] = "0X:41:DE:AD:BE:EF; -- EXIT --")

Другие вопросы по теме