Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中将sed的结果回显到文件中?_Bash_Unix_Awk_Sed_Echo - Fatal编程技术网

如何在bash中将sed的结果回显到文件中?

如何在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

我试图将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}
     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在索引上循环,需要事先知道文件的大小。