Si está de acuerdo con tener un segundo archivo para procesar esto, puede crear un archivo XSLT y usarlo para transformar su archivo XML usando xsltproc
.
teléfonos.xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="ContactPerson">
<xsl:value-of select="GivenName"/><xsl:text> </xsl:text><xsl:value-of select="FamilyName"/>
<xsl:for-each select="PhoneFixList/PhoneFix">
<xsl:text> </xsl:text><xsl:value-of select="."/>
</xsl:for-each>
<xsl:for-each select="EmailList/Email">
<xsl:text> </xsl:text><xsl:value-of select="."/>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Luego transforme el archivo (usando el XML de @Kusalananda comophones.xml
):
$ xsltproc phones.xsl phones.xml
John Wayne 78787878 john.wayne@gmail.com
James Stewart 90909090 james.stewart@gmail.com
El uso de XSLT tiene la ventaja de que puede recorrer elementos repetitivos, generar resultados condicionales, etc. Si te sientes cómodo con un poco de estudio y programación, es muy poderoso.
Если вы заключите свой первый аргумент в $()
, вы получите желаемый результат.
./test.sh "$(VAR=abc; echo $VAR)" "def"
В этом случае bash будет использовать подоболочку для выполнения настройки VAR=abc
, за которой следует echo $VAR
, а затем STDOUT из этой подоболочки используется в качестве аргумента test.sh
$1
.
РЕДАКТИРОВАТЬ
Чтобы получить обе переменные, назначенные из одной настройки переменной, вам нужно получить обе из подоболочки.
./test.sh $(VAR='abc'; echo $VAR $VAR)
Удалив кавычки вокруг $()
, мы знаем, что поймать первое слово в STDOUT подоболочки как $1
, а второе слово как $2
.
Однако, поскольку $VAR
не устанавливается в родительской оболочке, вы не можете использовать $VAR
напрямую.
Однако вы можете использовать подоболочку для установки $VAR
.
VAR=$(VAR=abc; echo $VAR)./test.sh $VAR $VAR
или для удобства чтения
VAR=$(FOO=abc; echo $FOO)./test.sh $VAR $VAR
Почему бы и нет var=abc;./test.sh "$var" "$var"
?
Или вызовите скрипт с одним аргументом, и скрипт обработает отсутствующее значение:
#!/bin/bash
fieldValue1=$1
fieldValue2=${2:-$1}
...
, затем:./test.sh foo
выводит{"field1"="foo", "field2"="foo"}
Обратите внимание, что это не JSON :используйте двоеточие, не равное:{"field1":"foo", "field2":"foo"}
Также вы оставляете переменные без кавычек, когда назначаете переменную jsonString. Сделай это
jsonString='{"field1":"'"$fieldValue1"'", "field2":"'"$fieldValue2"'"}'
#......................^............^...............^............^
# or
jsonString="{'field1':'$fieldValue1', 'field2':'$fieldValue2'}"
# or
printf -v jsonString '{"field1":"%s","field2":"%s"}' "$fieldValue1" "$fieldValue2"
Также следует защититься от значений, содержащих кавычки:
printf -v jsonString '{"field1":"%s","field2":"%s"}' \
"${fieldValue1//\"/\\\"}" \
"${fieldValue2//\"/\\\"}"
Тогда
$./test.sh 'he said "foo"'
{"field1":"he said \"foo\"","field2":"he said \"foo\""}
На основе обновленных требований. Назначение переменной должно быть отдельным шагом. Вам также не хватает синтаксиса замены команды$(...)
Первый обновленный скрипт:
#!/bin/bash
pairs=()
for ((i=1; i<=$#; i++)); do
value=${!i}
pairs+=( "$(printf '"%s":"%s"' "field$i" "${value//\"/\\\"}")" )
done
IFS=,
echo "{${pairs[*]}}"
Затем вызовите его следующим образом
startDate=1/1/2020
bash test.sh "$startDate" someOtherValue "$startDate" "$(date -u -d "$startDate 1 hour" "+%FT%TZ")" "anotherValue"
и получите этот вывод:
{"field1":"1/1/2020","field2":"someOtherValue","field3":"1/1/2020","field4":"2020-01-01T01:00:00Z","field5":"anotherValue"}
Похоже, вы пытаетесь заново изобрести csvjson
из CSVkit:
$ cat file.csv
A,B,C
1,2,3
4,5,6
$ csvjson file.csv
[{"A": 1.0, "B": 2.0, "C": 3.0}, {"A": 4.0, "B": 5.0, "C": 6.0}]
$ csvjson -i 4 file.csv
[
{
"A": 1.0,
"B": 2.0,
"C": 3.0
},
{
"A": 4.0,
"B": 5.0,
"C": 6.0
}
]