我有一个如下所示的文本。
<div><p class="title">software
v1.0.1.0
download</p></div>
<div><p class="title">software
v1.0.2.0
download</p></div>
<div><p class="title">software
v1.0.3.0
download</p></div>
我需要替换范围中的换行符<p class="title">...</p>
。让它看起来像下面这样。
<div><p class="title">software v1.0.1.0 download</p></div>
<div><p class="title">software v1.0.2.0 download</p></div>
<div><p class="title">software v1.0.3.0 download</p></div>
我可以使用 sed 来做到这一点吗?提前感谢任何帮助!
答案1
如果您的文件仅包含这 3 个“重复”行,您可以使用以下内容:
$ sed 'N;N;s/\n/ /g' file
这会产生:
<div><p class="title">software v1.0.1.0 download</p></div>
<div><p class="title">software v1.0.2.0 download</p></div>
<div><p class="title">software v1.0.3.0 download</p></div>
sed
如果您的文件包含其他行,请使用以下脚本:
$ sed '/class="title"/ { N;N;s/\n/ /g }' file
答案2
因为GNU
您可以使用以下sed
sed -n '/class="title"/{N;s/\n/ /;N;s/\n/ /p;}' file.txt
N
将下一行追加到模式空间
答案3
你甚至不需要sed
这里。你可以这样做paste
:
paste -d ' ' - - - < file
或者:
paste -sd ' \n' file
要将换行符替换为其后下<p class="title">
一个出现的空格</p>
:
perl -0777 -pe 's{<p class="title">.*?</p>}{$& =~ y/\n/ /r}gse' < file
答案4
<div>
您的问题可以解释为如何折叠行,并仅在 a关闭时打印换行符。当然,这适用于简单的 html 位,而不适用于任何 html。这里使用 awk:
awk '{ORS = (/\/div>$/? "\n": " ")} 1' file
/div>
如果在行尾匹配,则将 ORS(输出记录分隔符)设置为换行符,否则将 ORS 设置为空格。1
意味着{print}
每一行。
<div><p class="title">software v1.0.1.0 download</p></div>
<div><p class="title">software v1.0.2.0 download</p></div>
<div><p class="title">software v1.0.3.0 download</p></div>