如何在bash中将sed的结果回显到文件中?
我试图将sed命令的结果回显到另一个.html文件中。 sed命令是逐行读取一个.txt文件,并只取第二个值,该值由逗号分隔符分隔 以下是我所拥有的:如何在bash中将sed的结果回显到文件中?,bash,unix,awk,sed,echo,Bash,Unix,Awk,Sed,Echo,我试图将sed命令的结果回显到另一个.html文件中。 sed命令是逐行读取一个.txt文件,并只取第二个值,该值由逗号分隔符分隔 以下是我所拥有的: ind=1 while [ $ind -lt 4 ] do echo "<tr><td>" >> ${HTML_FILE} echo "`sed -n '$ind p' ${TEXT_FILE} | awk -F ',' '{print $2}'`" >> ${HTML_FILE
ind=1
while [ $ind -lt 4 ]
do
echo "<tr><td>" >> ${HTML_FILE}
echo "`sed -n '$ind p' ${TEXT_FILE} | awk -F ',' '{print $2}'`" >> ${HTML_FILE}
echo "</td></tr>" >> ${HTML_FILE}
ind=$((ind+1))
done
当我运行代码时,这里是我的输出。出于某种原因,它会打印“nd p”:
<tr><td>
nd p
</td></tr>
<tr><td>
nd p
</td></tr>
<tr><td>
nd p
</td></tr>
钕磷
钕磷
钕磷
预期输出应类似于:
<tr><td>Text 1 | 34%</td></tr>
<tr><td>Text 2 | 86%</td></tr>
<tr><td>Text 3 | 100%</td></tr>
Text 1 | 34%
文本2 | 86%
文本3 | 100%
使用GNU。我从s//
切换到s | | | |
,从正则表达式切换到扩展正则表达式(-r
)
sed-r的|^[^,]*,(.*)|\1 |文件
输出:
<tr><td>Text 1 | 34%</td></tr>
<tr><td>Text 2 | 86%</td></tr>
<tr><td>Text 3 | 100%</td></tr>
Text 1 | 34%
文本2 | 86%
文本3 | 100%
使用GNU。我从s//
切换到s | | | |
,从正则表达式切换到扩展正则表达式(-r
)
sed-r的|^[^,]*,(.*)|\1 |文件
输出:
<tr><td>Text 1 | 34%</td></tr>
<tr><td>Text 2 | 86%</td></tr>
<tr><td>Text 3 | 100%</td></tr>
Text 1 | 34%
文本2 | 86%
文本3 | 100%
至少,完全放弃sed
和awk
。每生产一条线运行一次,这太过分了
ind=1
while [ "$ind" -lt 4 ]
do
IFS=, read _ x _
echo "<tr><td>$x</td></tr>"
ind=$((ind+1))
done < "$TEXT_FILE" >> "$HTML_FILE"
ind=1
而[“$ind”-lt 4]
做
如果s=,则读取x_
回音“$x”
ind=$((ind+1))
完成<“$TEXT\u文件”>>“$HTML\u文件”
至少,完全放弃sed
和awk
。每生产一条线运行一次,这太过分了
ind=1
while [ "$ind" -lt 4 ]
do
IFS=, read _ x _
echo "<tr><td>$x</td></tr>"
ind=$((ind+1))
done < "$TEXT_FILE" >> "$HTML_FILE"
ind=1
而[“$ind”-lt 4]
做
如果s=,则读取x_
回音“$x”
ind=$((ind+1))
完成<“$TEXT\u文件”>>“$HTML\u文件”
或仅限awk:
awk -F, 'NR < 4 {print "<tr><td>" $2 "</td></tr>"}' "$TEXT_FILE" >> "$HTML_FILE"
awk-F,'NR<4{print”“$2”“}'”$TEXT\u FILE“>>“$HTML\u FILE”
或仅限awk:
awk -F, 'NR < 4 {print "<tr><td>" $2 "</td></tr>"}' "$TEXT_FILE" >> "$HTML_FILE"
awk-F,'NR<4{print”“$2”“}'”$TEXT\u FILE“>>“$HTML\u FILE”
不要使用echo“`cmd`”
只要使用cmd
即可。在sed-n'$ind'p'
$ind不会被它的内容取代使用sed-n$ind'p'
你仍然需要(或至少应该)用双引号引用$ind
,以防止分词和路径名扩展。@chepner:好的一点,我把引号去掉了,因为这是保存它的罕见情况之一(ind=1
和ind=$((ind+1))
).但你是对的,只是添加引号是一种很好的做法。我建议使用xmlstarlet生成HTML/XML。谢谢你的评论。我实际上才刚刚开始学习shell脚本。事实上,我今天才学会如何使用sed和awk!哈哈,但真的谢谢你,我会记下你们说的一切。:)不要使用echo“`cmd`”
只需使用cmd
。在sed-n'$ind'p'
$ind不会被它的内容取代使用sed-n$ind'p'
你仍然需要(或至少应该)用双引号引用$ind
,以防止分词和路径名扩展。@chepner:好的一点,我把引号去掉了,因为这是保存它的罕见情况之一(ind=1
和ind=$((ind+1))
).但你是对的,只是添加引号是一种很好的做法。我建议使用xmlstarlet生成HTML/XML。谢谢你的评论。我实际上才刚刚开始学习shell脚本。事实上,我今天才学会如何使用sed和awk!哈哈,但真的谢谢你,我会记下你们所说的一切。:)如果这是bash,((ind=1;ind<4;ind++)的;执行…
每行调用读取一次也太过分了。看见只是。对于这么小的东西,读取的开销可以忽略不计,并且可能与启动新进程以运行awk
的开销相当。没有理由认为OPs真正的输入文件很小,并且您可以选择在小文件或大文件上快速运行的工具,还是只在小文件上快速运行的工具(快速执行并不重要)后者没有其他好处——使用前者是有意义的,尤其是当前者需要更少的代码并且更健壮时。@EdMorton如果他们只处理前4行,输入文件有多大并不重要。也许在现实生活中,ind
的上限是24000,而不是4,在这种情况下,我绝对推荐awk
。但是在前面提到的问题中,只使用shell没有问题;执行…
每行调用读取一次也太过分了。看见只是。对于这么小的东西,读取的开销可以忽略不计,并且可能与启动新进程以运行awk
的开销相当。没有理由认为OPs真正的输入文件很小,并且您可以选择在小文件或大文件上快速运行的工具,还是只在小文件上快速运行的工具(快速执行并不重要)后者没有其他好处——使用前者是有意义的,尤其是当前者需要更少的代码并且更健壮时。@EdMorton如果他们只处理前4行,输入文件有多大并不重要。也许在现实生活中,ind
的上限是24000,而不是4,在这种情况下,我绝对推荐awk
。但是在前面提到的问题中,仅仅使用外壳是没有问题的。这个。虽然我认为即使是NR<4
也是多余的,因为OP没有指出“索引小于4”测试的目的。是的,可能是由于OP在索引上循环,需要事先知道文件的大小。这一个。虽然我认为即使是NR<4
也是多余的,因为OP没有指出“索引小于4”测试的目的。是的,可能是由于OP在索引上循环,需要事先知道文件的大小。