Цитирую 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".
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 prop
cuyo atributo prop-type
es TemplateCode
. La variable LOBCODE
obtendrá el valor XXPO_PHYS_INV_ADJ_ES_AS
con el XML anterior.
XMLStarlet a veces se puede instalar como xmlstarlet
en lugar de como xml
.
Hay dos problemas con su código:
Redirige la salida del comando sed
a un archivo cuyo nombre viene dado por $LOBCODE
. Si $LOBCODE
está vacío, esta redirección fallará. Lo que supongo que quería hacer era asignar la salida de sed
a la variable LOBCODE
. Esto se hace con una sustitución de comando como se muestra arriba. Tenga en cuenta que sed
es una mala elección de herramienta para analizar datos XML.
Le indicas a sed
que trabaje con un archivo llamado filename
. Para que sed
funcione 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 ).
La respuesta de @Kusalananda es excelente, pero si tiene xmllint
en 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:
prop-group
con el atributo "ora -reconstrucción". El método de @Kusalananda asume que desea cualquier elemento prop
con 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, xmllint
tambié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
$ 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