извлечь значение тега xml из файла, в котором в имени файла есть пробелы.

Цитирую man usermod :

CAVEATS
   You must make certain that the named user is not executing any 
   processes when this command is being executed
   if the user's numerical user ID, the user's name, or the user's home 
   directory is being changed.  usermod
   checks this on Linux, but only check if the user is logged in 
   according to utmp on other architectures.

Итак, вам нужно убедиться, что пользователь, которого вы переименовываете, не вошел в систему.

Также, я заметил, что вы не запускаете это от имени root. Либо запустите его от имени root, либо запустите с "sudo usermod".

1
18.11.2018, 11:26
3 ответа

Asumiendo que el archivo XML está bien formado:

<?xml version="1.0"?>
<header>
  <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
  </prop-group>
</header>

Usando XMLStarlet:

xmlfile='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$( xml sel -t -v '//prop[@prop-type="TemplateCode"]' "$xmlfile" )

Esto usa XMLStarlet para extraer el valor del nodo propcuyo atributo prop-typees TemplateCode. La variable LOBCODEobtendrá el valor XXPO_PHYS_INV_ADJ_ES_AScon el XML anterior.

XMLStarlet a veces se puede instalar como xmlstarleten lugar de como xml.


Hay dos problemas con su código:

  1. Redirige la salida del comando seda un archivo cuyo nombre viene dado por $LOBCODE. Si $LOBCODEestá vacío, esta redirección fallará. Lo que supongo que quería hacer era asignar la salida de seda la variable LOBCODE. Esto se hace con una sustitución de comando como se muestra arriba. Tenga en cuenta que sedes una mala elección de herramienta para analizar datos XML.

  2. Le indicas a sedque trabaje con un archivo llamado filename. Para que sedfuncione en el valor de la variable filename, deberá usar $delante del nombre de la variable. Además, dado que el nombre del archivo tiene espacios,necesita comillas dobles la expansión variable (debe siempre hacer esto, independientemente ). Por lo tanto, debe usar"$filename"(He usado un nombre de variable más descriptivo en mi código anterior ).

2
28.01.2020, 02:12

La respuesta de @Kusalananda es excelente, pero si tiene xmllinten su lugar, puede usar este:

filename='ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf'
LOBCODE=$(xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@prop-type='TemplateCode']/text()" "$filename")

Notas:

  • Utilicé la especificación de ruta completa en caso de que solo desee el prop-groupcon el atributo "ora -reconstrucción". El método de @Kusalananda asume que desea cualquier elemento propcon un atributo de "TemplateCode" :, qué método es preferible depende de sus datos.
  • text()devuelve solo el texto dentro del elemento prop(de lo contrario, xmllinttambién devuelve el elemento circundante.)

Ejemplo de ejecución de la parte importante:

$ xmllint --xpath "header/prop-group[@name='ora_reconstruction']/prop[@proptype='TemplateCode']/text()" "ES - Physical Inventory Adjustment Report US PDF_es_ES.xlf"
XXPO_PHYS_INV_ADJ_ES_AS
0
28.01.2020, 02:12
$ cat test.xml
<header>
 <prop-group name="ora_reconstruction">
    <prop prop-type="TemplateCode">XXPO_PHYS_INV_ADJ_ES_AS</prop>
    <prop prop-type="extractorVersion">10.1.3.4.2_1.5</prop>
 </prop-group>

$ awk -F"[<>]" '/TemplateCode/{print $3;exit}' test.xml
XXPO_PHYS_INV_ADJ_ES_AS
-2
28.01.2020, 02:12

Теги

Похожие вопросы