ファイル内の複数の行を単一の単語に置き換えるにはどうすればよいですか?


9

私のfilenameファイルの内容は次のとおりです(たとえば):

My block of line starts from here 
START
First line
second line
third line
END
and end to here for example.

私は間のラインのブロックを交換したいSTARTENDして、たとえば、1つだけの単語でSINGLEWORD。以下のように:

My block of line starts from here 
SINGLEWORD
and end to here for example.

次のコマンドを使用して、行ブロックを見つけることができます。

grep -Pzo "START(.|\n)*END" filename

上記のコマンドを実行した結果は次のようになります。

START
First line
second line
third line
END

次に、このコマンドを使用して、すべての行を1行に結合しました。

LAST_RESULT | sed -e :a -e '/$/N; s/\n/ /; ta'

次に、この結果を取得します。

START First line second line third line END

そして、最後のコマンドでLAST_RESULTS | sed 's/.*/SINGLEWORD/'それらをに変更すると"SINGLEWORD"、この結果が得られます。

SINGLEWORD

今私が欲しいのは、どうすればこのコマンド(またはあなたの提案コマンド)を使用して、行のブロックを「SINGLEWORD」単語に置き換えることができますか?最終的な結果は次のファイルのようになります。

My block of line starts from here 
SINGLEWORD
and end to here for example.

回答:


13

これは非常に簡単に行うことができますperl

$ perl -i -p0e 's/START.*?END/SINGLEWORD/s' file
$ cat file
My block of line starts from here 
SINGLEWORD
and end to here for example. 

説明

-0 行区切りをnullに設定します

-pで指定されたスクリプト-eを各行に適用し、その行を出力します

正規表現修飾子:

  • /s文字列を単一行として扱います。つまり、.通常は一致しない改行でも、すべての文字に一致するように変更します。

なぜ?

  • デフォルトでは、定量化されたサブパターンは「貪欲」です。つまり、パターンの残りの部分を一致させながら、できるだけ多くの回数(特定の開始位置が指定された場合)一致します。可能な最小回数に一致させたい場合は、量指定子の後にを付けます?

@KasiyA:使用sedは可能であるべきですが、おそらく読みにくい(この質問を見てください)
シルヴァンピノー14年

もう一つの私のSTARTとENDパターンが特殊な文字(持っているので/*?その中に)、これらは一例です。そして、あなたのコマンドを説明してもらえますか。
αғsнιη

@KasiyAあなたは\(正確と同様に、このような文字をエスケープすることができますsed。) 、、\/\*\?
シルヴァン・ピノー

@KasiyA試しましたperl -i -p0e 's/\/\*.*?\*\//SINGLEWORD/sm'。動作するはずです
シルヴァンピノー14年

@KasiyA私は今説明を終えたと思う;)
シルヴァンピノー14年

13

これがなくても可能である場合、私は思っていたperlpythonなど。そして、私はこのソリューションを使用して見つけましたsed

$ sed ':a;N;$!ba;s/START.*END/SINGLEWORD/g' filename

説明:

  1. :a ラベル 'a'を作成します
  2. N パターンスペースに次の行を追加します
  3. $! 最後の行ない場合ba 分岐(移動)ラベル 'a'
  4. sの 代替/START.*END/によってSINGLEWORD/ gの グローバルマッチ(何度でもそれができるように)

ここで見つかりまし

@KasiyA、私は多くの興味深いことを学んでくれてありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.