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>

rangeで改行文字を置き換える必要があります<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>

関連情報