2

我有一个 html 文件,我基本上尝试删除第一次出现的<...>with sub/gsub功能。

我使用 awk 正则表达式. * +来匹配< >. 然而,第一次出现>的被转义(?)。我不知道是否有解决方法。

示例输入 file.txt x添加不打印空)

<div>fruit</div></td>x
<span>banana</span>x
<br/>apple</td>x

代码

awk '{gsub(/^<.*>/,""); print}' file.txt

电流输出:

x
x
x

所需的输出:

fruit</div></td>x
banana</span>x
apple</td>x
4

2 回答 2

3

使用您显示的示例,请尝试以下awk代码。简单的解释是,使用编程sub的替代功能。然后用当前行中的 NULLawk替换开始<直到(使用[^>]方法直到第一次出现>),最后打印已编辑/未编辑的行。>>1

awk '{sub(/^<[^>]*>/,"")} 1' Input_file


第二种解决方案:使用match的功能awk匹配从第一次出现<到第一次出现的值>并打印行的其余部分。

awk 'match($0,/^<[^>]*>/){print substr($0,RSTART+RLENGTH)}' Input_file

或者,如果您有不是从开始的行<并且您想打印它们,那么请使用以下内容:

awk 'match($0,/^<[^>]*>/){print substr($0,RSTART+RLENGTH);next} 1' Input_file
于 2021-09-02T08:03:23.483 回答
1

然而,第一次出现>的被转义(?)。

不,你得到的结果是由于 GNU手册说的AWK那样

awk(...)正则表达式总是匹配可以匹配的最左边、最长 的输入字符序列

这在其他语言的正则表达式用法中称为贪婪,所以说

<div>fruit</div></td>x

/^<.*>/匹配

<div>fruit</div></td>

因此你以 . 结尾x。在支持所谓的非贪婪匹配的语言中,您可以在这种情况下利用它,例如在 ECMAScript 中

let str = "<div>fruit</div></td>x";
let out_str = str.replace(/^<.*?>/, "");
console.log(out_str);

输出

fruit</div></td>x

正如 GNUAWK手册所说,在 GNU 中AWK它总是最长的(贪婪的),因此你必须使用[^>]ie all but>来防止匹配从第一个<到最后一个>包含>在里面。

于 2021-09-02T10:29:10.133 回答