【问题标题】:How to change (unknown) numbers of a file using bash [closed]如何使用 bash 更改(未知)文件的编号 [关闭]
【发布时间】:2020-03-01 16:22:17
【问题描述】:

我有一个 html 文件,我应该(使用 Bash)更改里面的数字。 这是一个例子:

<TR><TD ALIGN=center><FONT SIZE="-1"><B>28</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>58</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>44</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>1220</B></FONT></TD>
<TR><TD ALIGN=center><FONT SIZE="-1"><B>29</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>57</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>43</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>730</B></FONT></TD>
<TR><TD ALIGN=center><FONT SIZE="-1"><B>30</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>56</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>41</B></FONT></TD>
<TD ALIGN=right><FONT SIZE="-1"><B>736</B></FONT></TD>

我知道数字都包含在标签“&lt;B&gt;”和“&lt;/B&gt;”中。

这些数字都必须乘以 3。

我该怎么办?

我正在尝试编写脚本但没有成功。

谢谢

【问题讨论】:

  • 到目前为止您尝试过什么?你最好的尝试是什么?
  • 这可以在单个awk 脚​​本中完成,但我不擅长awk,所以我会这样做: 1. 使用sed 提取&lt;B&gt;[0-9]*&lt;/B&gt; 和把它放在线的前面。 2. 用awk 将它乘以 3。就是awk '{ $1*=3 }1。 3. 将号码放回与正确sed 对应的行中。 Here is a sed introduction,学习正则表达式最简单的方法是to play games like crosswords with it
  • 我正在尝试使用sedawk,但我不知道该怎么做。我需要修改的数据位于数千个 html 行中(我用 grep 过滤,只保留那些具有 &lt;B&gt; 标签的数据),但我无法进行替换
  • the midst of thousands of html lines - 然后我建议not to parse html with regex。使用 html 的专用工具,xmllintxmlstarlet 等。

标签: bash awk sed scripting


【解决方案1】:

使用 HTML 感知工具修改 HTML。比如xsh,可以写

open :F html file.html ;
for //b
    set . (3 * .) ;
save :F html :b ;

【讨论】:

    【解决方案2】:

    awksed 可能不是最好的工具,但这可以工作:

    awk -F'<B>|</B>' -v OFS= '{$2="<B>"$2*3"</B>"}1' file
    <TR><TD ALIGN=center><FONT SIZE="-1"><B>84</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>174</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>132</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>3660</B></FONT></TD>
    <TR><TD ALIGN=center><FONT SIZE="-1"><B>87</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>171</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>129</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>2190</B></FONT></TD>
    <TR><TD ALIGN=center><FONT SIZE="-1"><B>90</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>168</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>123</B></FONT></TD>
    <TD ALIGN=right><FONT SIZE="-1"><B>2208</B></FONT></TD>
    

    【讨论】:

    • 谢谢,您认为最好的工具是什么?如何使用更新的数据重写文件?如果我再次使用"&gt; filename" 编写它会给我一个完全交错的文件。是否有可能只重写旧文件中的数字数据?是否也可以四舍五入?
    • @Ignazio 使用awk 重写数据然后执行:awk 'my commands' file &gt; tmp &amp;&amp; mv tmp file 一切皆有可能,只是需要更多时间,
    猜你喜欢
    • 2018-10-02
    • 2020-01-07
    • 2017-05-08
    • 2014-10-12
    • 2011-04-16
    • 2022-06-28
    • 2012-02-16
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多