Prägnantere Methoden zum Umschließen einer Datei als die Verwendung von sed

Prägnantere Methoden zum Umschließen einer Datei als die Verwendung von sed

Einführung

Skript:

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

Eingang:

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

Ausgabe:

<?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>

Frage

Welche Methoden zum Umschließen einer Datei gibt es prägnanter als die Verwendung von sed?

Antwort1

Wie ich in meinem Kommentar sagte, verstehe ich Ihre eigentliche Frage nicht. Hier sind einige prägnantere Möglichkeiten, das zu tun, was Ihr sedSkript tut:

$ 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>

oder

$ 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>

oder

$ 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>

Sie können die Datei direkt mit bearbeiten perl -i -ple.

oder

$ 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>

oder eine Mischung:

$ 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>

Antwort2

Nicht prägnanter, aber vielleicht lesbarer:

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

Antwort3

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

Antwort4

{
  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"

Wäre portabler, effizienter und lesbarer, wenn nicht sogar kürzer.

verwandte Informationen