Этот массив существует в скрипте 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[@]}"
Пожалуйста, посмотрите этот ответ: stackoverflow.com/a/26314887/2805824
@GauravPathak, который также удалит кавычки внутри поля.
Да все верно, заметил только заголовок --> убрать двойные кавычки со всех полей
Предполагая, что «в 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[@]}"
Хороший. Вы опередили меня, когда я пытался придумать способ сделать правки таким образом за один проход, но глобусы не являются регулярными выражениями, лол - забавное упражнение, однако.
«За один проход» было бы возможно, если бы не требование сохранять кавычки, отличные от начальных и конечных. fields=("${fields[@]//\"}")
в таком случае удалит все кавычки.
Ага. Единственная проблема здесь в том, что шары всегда привязаны к обоим концам. :)
Если это тот же массив, который вы недавно просили помочь заполнить, вы можете удалить те кавычки, где он заполняется, а не на отдельном этапе впоследствии. Сценарий 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[]
напрямую во время чтения в этом случае, поскольку пустое поле приведет к обратным \n
s, а когда 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 --")
ты пробовал
echo "${fields[@]}" | tr -d '"'
?