gawk printf пропущенные символы

Я пытаюсь создать скрипт в (g)AWK, в котором я хотел бы поместить следующие ТОЧНЫЕ строки в начало выходного текстового файла:

<?xml version="1.0" encoding="UTF-8"?>
<notes version="1">
    <labels>
        <label id="0" color="30DBFF">Custom Label 1</label>
        <label id="1" color="30FF97">Custom Label 2</label>
        <label id="2" color="E1FF80">Custom Label 3</label>
        <label id="3" color="FF9B30">Custom Label 4</label>
        <label id="4" color="FF304E">Custom Label 5</label>
        <label id="5" color="FF30D7">Custom Label 6</label>
        <label id="6" color="303EFF">Custom Label 7</label>
        <label id="7" color="1985FF">Custom Label 8</label>
    </labels>

а это до конца:

</notes>

Вот мой скрипт на данный момент:

BEGIN       {printf("<?xml version="1.0" encoding="UTF-8"?>\n") > "notes.sasi89.xml"}

END         {printf("</notes>") > "notes.sasi89.xml"}

Моя проблема в том, что он не печатает так, как мне хотелось бы, он дает мне это в выходном файле:

<?xml version=1 encoding=-8?>
</notes>

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


person sasieightynine    schedule 02.07.2015    source источник
comment
вам нужно избегать кавычек: printf(‹?xml version=\1.0\ encoding=\UTF-8\?›\n)   -  person swstephe    schedule 03.07.2015
comment
Круто, работает, большое спасибо, я новичок в awk, я уже создал несколько простых скриптов для себя, теперь я пытаюсь создать что-то более сложное.   -  person sasieightynine    schedule 03.07.2015
comment
@swstephe: Опубликуйте это как ответ, и я проголосую за него. Может быть, sasieightynine примет в качестве ответа. Тогда он больше не будет отображаться в открытой очереди ;-) Всем удачи.   -  person shellter    schedule 03.07.2015
comment
Да, я бы определенно принял это.   -  person sasieightynine    schedule 03.07.2015


Ответы (1)


Ответ: Вики сообщества, чтобы отдать должное там, где это необходимо.

Основная проблема и решение

Как swstephe отмечено в комментарий:

Вам нужно избегать кавычек:

printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")

Антипаттерны

Я расцениваю ваш сценарий схемы как антипаттерн (на самом деле, два антипаттерна). У тебя есть:

BEGIN       {printf("<?xml version="1.0" encoding="UTF-8"?>\n") > "notes.sasi89.xml"}
END         {printf("</notes>") > "notes.sasi89.xml"}

Антипаттерны:

  1. Вы повторяете имя файла; Вы не должны. Вам лучше использовать:

    BEGIN {file = "notes.sasi89.xml"
           printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") > file}
    END   {printf("</notes>") > file}
    
  2. Вам вообще не следует выполнять перенаправление ввода/вывода в сценарии awk. Вы должны позволить оболочке выполнить перенаправление ввода-вывода.

    awk '
    BEGIN {printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")}
    END   {printf("</notes>")}
    ' > notes.sasi89.xml
    

Бывают случаи, когда перенаправление ввода-вывода в сценарии является подходящим, но тогда вам нужен вывод в несколько файлов. Когда, как здесь кажется очень вероятным, у вас есть только один выходной файл, заставьте сценарий писать в стандартный вывод, а оболочке сделать перенаправление ввода-вывода. Он намного более гибкий; вы можете более легко переименовать файл и отправить вывод другим программам через канал и т. д., что намного сложнее, если у вас есть имя выходного файла, встроенное в скрипт awk.

person Community    schedule 03.07.2015
comment
Спасибо за ваш комментарий, Джонатан, я буду иметь его в виду в следующий раз. - person sasieightynine; 03.07.2015
comment
Если swstephe опубликует ответ, примите его вместо этого. Спасибо. - person Jonathan Leffler; 03.07.2015
comment
Все в порядке, вы сделали все тяжелые объяснения. - person swstephe; 04.07.2015