【问题标题】:How to echo result of sed to a file in bash?如何将 sed 的结果回显到 bash 中的文件?
【发布时间】:2019-02-18 07:23:25
【问题描述】:

我正在尝试将 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

${TEXT_FILE} 的内容:

709A8, Text 1 | 34%
354Y7, Text 2 | 86%
F1065, Text 3 | 100%

当我运行我的代码时,这是我的输出。出于某种原因,它会打印“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>

【问题讨论】:

  • 不要使用echo "`cmd`",而是使用cmd。在sed -n '$ind p' $ind 不会被其内容替换,使用sed -n $ind' p'
  • 您仍然需要(或至少应该)用双引号引用 $ind 以防止分词和路径名扩展。
  • @chepner:很好,我把引号去掉了,因为这是保存它的罕见情况之一(ind=1ind=$((ind+1)))。但你是对的,无论如何添加引号是一个好习惯。
  • 我推荐使用xmlstarlet来生成HTML/XML。
  • 感谢您的 cmets。我实际上才刚刚开始学习 shell 脚本。事实上,我今天才学会了如何使用 sed 和 awk!哈哈,不过真的谢谢你们,你们说的我都会注意的。 :)

标签: bash unix awk sed echo


【解决方案1】:

或者只是 awk:

awk -F, 'NR < 4 {print "<tr><td>" $2 "</td></tr>"}' "$TEXT_FILE" >> "$HTML_FILE"

【讨论】:

  • 这个。虽然我认为即使是 NR &lt; 4 也是多余的,因为 OP 没有说明“索引小于 4”测试的用途。
  • 是的,可能是由于 OP 在索引上循环,需要事先了解文件的大小。
【解决方案2】:

使用 GNU sed。我从 s/// 切换到 s||| 并从正则表达式切换到扩展正则表达式 (-r)。

sed -r 's|^[^,]*, (.*)|<tr><td>\1</td></tr>|' file

输出:

<tr><td>Text 1 | 34%</td></tr>
<tr><td>Text 2 | 86%</td></tr>
<tr><td>Text 3 | 100%</td></tr>

【讨论】:

    【解决方案3】:

    至少,完全放弃sedawk。为每一行运行一次是多余的。

    ind=1
    while [ "$ind" -lt 4 ]
    do
         IFS=, read _ x _
         echo "<tr><td>$x</td></tr>"
         ind=$((ind+1))
    done < "$TEXT_FILE" >> "$HTML_FILE"
    

    【讨论】:

    • 如果这是 bash,for ((ind=1; ind &lt; 4; ind++)); do ...
    • 每行调用一次read 也太过分了。见why-is-using-a-shell-loop-to-process-text-considered-bad-practice。只需call awk once
    • 对于这么小的东西,read 的开销可以忽略不计,并且可能与启动新进程以运行 awk 的开销相当。
    • 没有理由认为 OP 的实际输入文件很小,当您可以在可以在小文件或大文件上快速运行的工具与仅在小文件上快速运行的工具之间做出选择时(快速执行无关紧要)并且后者没有其他好处,使用前者才有意义,尤其是当前者需要更少的代码并且更健壮时。
    • @EdMorton 如果它们只处理前 4 行,那么输入文件的大小并不重要。也许在现实生活中,ind 的上限是 24000,而不是 4,在这种情况下,我肯定会推荐awk。但是在上述问题中,仅使用shell没有问题。
    猜你喜欢
    • 2021-12-29
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多