【问题标题】:Entry points and their replacement入口点及其替换
【发布时间】:2020-03-09 13:04:42
【问题描述】:

我有以下文字:

...
<tr>
<td>123AB:</td>
<td>173.2 von 5000 MB</td>
</tr>
<tr>
<td>123ABC:</td>
<td>3029.7 von 5000 MB</td>
</tr>
<tr>
...

我正在尝试以以下格式获取它:

173.2 - A
3029.7 - B

即获取von 5000 MB&lt;/td&gt; 之前的值,然后写入文本。我正在尝试通过以下方式获取它:

sed -En 's/.*&lt;td&gt;(.*) von 5000.*/\1 - A/p' ./file.txt

输出:

173.2 - A
3029.7 - A

这个命令在全局范围内有效——这是正确的;我只是不知道如何只替换第一个条目,然后替换另一个条目。谁能告诉我正确的例子?谢谢!

附:我有 BSD sed。

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    sed 编辑器不适用于状态。考虑使用'awk',它在条件逻辑方面更灵活:

    awk '
    /<td>.* von 5000/ { n++ ; print gensub(".*<td>(.*) von 5000.*", "\\1 -", 1), n == 1 ? "A" : "B" } 
    '
    

    【讨论】:

    • 你可能是对的,我会接受任何选择。我得到下一个错误。 awk: syntax error at source line 1 context is /&lt;td&gt;.* von 5000/ { n++ ; print gensub(".*&lt;td&gt;(.*) von 5000.*", "\\1 -", 1), n &gt;&gt;&gt; == &lt;&lt;&lt; awk: illegal statement at source line 1 awk: illegal statement at source line 1
    • @KarlsD 命令适用于我的 Mint19 (awk 4.1.4)。您使用的是什么操作系统、awk 版本和 shell?
    • >awk --version; awk 版本 20070501; OS X,看起来我的版本很旧)
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 2010-12-14
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多