gawk printf 缺少字符
gawk printf missing characters
我正在尝试在 (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>
缺少一些字符和引用,我已经尝试学习手册,但对我来说这些听起来太复杂了,如果有人能帮助我或指导我正确的方向,我将不胜感激。
答案是 Community Wiki,它给出了在信用到期时可以给予的信用。
主要问题及解决方案
作为swstephe noted in a :
You need to escape your quotes:
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"}
反模式是:
你重复文件名;你不应该。你最好使用:
BEGIN {file = "notes.sasi89.xml"
printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") > file}
END {printf("</notes>") > file}
您首先不应该在 awk
脚本中执行 I/O 重定向。您应该让 shell 执行 I/O 重定向。
awk '
BEGIN {printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")}
END {printf("</notes>")}
' > notes.sasi89.xml
有时脚本中的 I/O 重定向是合适的,但那是您需要输出到多个文件的时候。在这里很可能只有一个输出文件时,让脚本写入标准输出并让 shell 执行 I/O 重定向。它更加灵活;您可以更轻松地重命名文件,并通过管道等将输出发送到其他程序,如果您将输出文件名嵌入到 awk
脚本中,这将非常困难。
我正在尝试在 (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>
缺少一些字符和引用,我已经尝试学习手册,但对我来说这些听起来太复杂了,如果有人能帮助我或指导我正确的方向,我将不胜感激。
答案是 Community Wiki,它给出了在信用到期时可以给予的信用。
主要问题及解决方案
作为swstephe noted in a
You need to escape your quotes:
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"}
反模式是:
你重复文件名;你不应该。你最好使用:
BEGIN {file = "notes.sasi89.xml" printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") > file} END {printf("</notes>") > file}
您首先不应该在
awk
脚本中执行 I/O 重定向。您应该让 shell 执行 I/O 重定向。awk ' BEGIN {printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")} END {printf("</notes>")} ' > notes.sasi89.xml
有时脚本中的 I/O 重定向是合适的,但那是您需要输出到多个文件的时候。在这里很可能只有一个输出文件时,让脚本写入标准输出并让 shell 执行 I/O 重定向。它更加灵活;您可以更轻松地重命名文件,并通过管道等将输出发送到其他程序,如果您将输出文件名嵌入到 awk
脚本中,这将非常困难。