如何使用sed从文件中删除一些字符



我在的某个文件中有这段代码

<pre class="bbCodeCode" dir="ltr" data-xf-init="code-block" data-lang=""><code>-Fix numcer one/Two
-EMM Support
-Fix update &lt; broken
-Add support patch</code></pre>
</div>
</div><b><br />

我需要删除一些字符并只保留这个代码

-Fix numcer one/Two
-EMM Support
-Fix update &lt; broken
-Add support patch

我试过这个代码

#!/bin/bash
sed -n '/>-/,/</p' /home/Desktop/1 > /home/Desktop/2
sed -n '/^-*code>/p' /home/raed/Desktop/2  > /home/Desktop/3
sed -i 's#</code></pre>##' /home/Desktop/3
exit

但是代码删除了第一行

-Fix numcer one/Two

试试这个

sed 's/<[^>]*>//g' <file

它将删除<和下一个>(线宽(之间的所有内容。

第一个解决方案: 请尝试GNUawk。使用您显示的样本,请尝试以下awk代码。

awk -v RS="^$" '
match($0,/(^|n)<pre class="[^"]*".*<code>-(.*)</code>/,arr){
print arr[2]
}
'  Input_file

解释:简单的解释是,使用GNUawk的功能使RS成为^$,然后使用其match函数匹配正则表达式(^|n)<pre class="[^"]*".*<code>-(.*)</code>(稍后在本答案中解释(。此正则表达式创建2个捕获组,所有匹配的值都存储到名为arr的数组中。因此,如果regex具有匹配的值,那么我只需使用arr[2]打印数组arr的第二个元素即可获得所需的值。



第二个解决方案:使用sed使用-z-E选项,请尝试以下代码。

sed -zE 's/(^|n)<pre class="[^"]*".*<code>-(.*)</code>.*/2/' Input_file

或者如果您的sed版本支持n,那么只要对上述sed代码进行轻微更改,您就可以获得以下内容:

sed -zE 's/(^|n)<pre class="[^"]*".*<code>-(.*)</code>.*/2n/' Input_file


第三个解决方案:使用GNUgrep,请尝试以下代码:

grep -zoP '(^|n)<pre class="[^"]*".*?<code>-K(.*?n[^n]+)+(?=</code>)'  Input_file


第四个解决方案:如果你真的想采用你的方法(看起来你没有GNU版本的sed(,那么让我在这里尝试一下你的方法,但这将是非常直接的sed,与我以前的解决方案相比,数据验证会少一些,但如果你的示例Input_file总是一样,这将为你完成任务。

sed -En '/^<pre class/s/^<pre class="[^"]*".*<code>-(.*)$/1/p; /^-/{s/</code>.*//; p}'  Input_file

相关内容

  • 没有找到相关文章

最新更新