使用 sed 替换字符串范围内的换行符

使用 sed 替换字符串范围内的换行符

我有一个如下所示的文本。

<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>

相关内容