Métodos más concisos para empaquetar un archivo que usar sed

Métodos más concisos para empaquetar un archivo que usar sed

Introducción

guion:

sed -i '1i <?xml version=\"1.0\" encoding=\"utf-8\"?>' $1
sed -i '/<?xml version=\"1.0\" encoding=\"utf-8\"?>/a<hello>\n\t<world>' $1
sed -i "\$a\\\t<\/hello>\n<\/world>" $1

aporte:

<city id="city01">
  <name>utrecht</author>
  <population>328.577</population>
  <districts>10</districts>
  <country>netherlands</country>
</city>

producción:

<?xml version="1.0" encoding="utf-8"?>
<hello>
  <world>
    <city id="city01">
      <name>utrecht</author>
      <population>328.577</population>
      <districts>10</districts>
      <country>netherlands</country>
    </city>
  </hello>
</world>

Pregunta

¿Cuáles son los métodos más concisos para empaquetar un archivo que usar sed?

Respuesta1

Como dije en mi comentario, no entiendo cuál es tu pregunta real. Aquí hay algunas formas más concisas de hacer lo que sedhace su script:

$ printf "%s\n%s\n\t%s\n%s\n%s\n%s\n" '<?xml version="1.0" encoding="utf-8"?>' \
'<hello>' '<world>' "$(cat file)" "</world>" "</hello>"
<?xml version="1.0" encoding="utf-8"?>
<hello>
    <world>
<city id="city01">
  <name>utrecht</author>
  <population>328.577</population>
  <districts>10</districts>
  <country>netherlands</country>
</city>
</world>
</hello>

o

$ echo -e '<?xml version="1.0" encoding="utf-8"?>' "\n<hello>\n<world>" "$(cat file)" \
"</world>\n</hello>"
<?xml version="1.0" encoding="utf-8"?> 
<hello>
<world> <city id="city01">
  <name>utrecht</author>
  <population>328.577</population>
  <districts>10</districts>
  <country>netherlands</country>
</city> </world>
</hello>

o

$ perl -lpe 'BEGIN{
            print "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<hello>\n\t<world>"
            } 
            $_="\t\t$_"; END{print "\t </world>\n</hello>"}' file
<?xml version="1.0" encoding="utf-8"?>
<hello>
    <world>
        <city id="city01">
          <name>utrecht</author>
          <population>328.577</population>
          <districts>10</districts>
          <country>netherlands</country>
        </city>
     </world>
</hello>

Puede editar el archivo en su lugar con perl -i -ple.

o

$ awk 'BEGIN{printf "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<hello>\n\t<world>";} 
        {print "\t\t",$0}END{printf "\t </world>\n</hello>\n"}' file
<?xml version="1.0" encoding="utf-8"?>
<hello>
    <world>      <city id="city01">
           <name>utrecht</author>
           <population>328.577</population>
           <districts>10</districts>
           <country>netherlands</country>
         </city>
     </world>
</hello>

o una mezcla:

$ echo -e '<?xml version="1.0" encoding="utf-8"?>\n<hello>\n\t<world>'; 
  perl -pe '$_="\t\t$_"' file; echo -e "</world>\n</hello>"
<?xml version="1.0" encoding="utf-8"?>
<hello>
    <world>
        <city id="city01">
          <name>utrecht</author>
          <population>328.577</population>
          <districts>10</districts>
          <country>netherlands</country>
        </city>
</world>
</hello>

Respuesta2

No más conciso, pero quizás más legible:

tmp=$(mktemp)
cat <<END >$tmp && mv $tmp "$1"
<?xml version="1.0" encoding="utf-8"?>
<hello>
    <world>
        $(sed 's/^/        /' "$1")
    </world>
</hello>
END

Respuesta3

awk -v indentchar=$'\t' \
'BEGIN { print "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; print "<hello>"; 
print indentchar "<world>";};
{ print indentchar indentchar $0; };
END { print indentchar "</world>"; print "</hello>"; }' file

Respuesta4

{
  rm -f -- "$1" &&
  {
    printf '<?xml version="1.0" encoding="utf-8"?>\n<hello>\n\t<world>\n'
    paste /dev/null -
    printf '\t</hello>\n</world>\n'
  } > "$1"
} < "$1"

Sería más portátil, eficiente y legible, si no más corto.

información relacionada