我在的某个文件中有这段代码
<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
试试这个
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