[英]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 < broken
-Add support patch</code></pre>
</div>
</div><b><br />
我需要删除一些字符并仅保留此代码
-Fix numcer one/Two
-EMM Support
-Fix update < 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.