繁体   English   中英

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

[英]How to use sed to remove some characters from file?

我在某个文件中有此代码

<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

第一种解决方案:为此尝试使用 GNU awk 对于您展示的样品,请尝试遵循awk代码。

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

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



第二种解决方案:使用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>.*/\2\n/' Input_file


第三种解决方案:使用 GNU grep请尝试以下代码:

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


第四种解决方案:如果你真的想用你的方法sed (看起来你没有 GNU 版本的sed )然后让我在这里尝试你的方法,但这将是非常简单的我的解决方案,但如果您的示例 Input_file 始终相同,这将为您完成工作。

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

尝试这个

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

它将删除<和下一个>之间的所有内容(逐行)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM