見つかった文字列を再印刷するために sed または別のコマンドを使用するにはどうすればよいでしょうか?

見つかった文字列を再印刷するために sed または別のコマンドを使用するにはどうすればよいでしょうか?

次のような文字列があります:testfsdfsdftestfsdkflsdtestsdfsdfsdf

testfsdfsdf次のように、最初の行に表示され、testfsdkflsd2 行目にも表示されるように文字列を分割する方法を知りたいです。

testfsdfsdf
testfsdkflsd
testsdfsdfsdf

を使用して、その後に続くものをsed検索しようとしましたが、再度印刷する方法がわかりません。 を使用すると、特定の文字列を検索し、それを別の文字列に置き換えることができるとわかっています。つまり、 のようなものを試したかったのですが、 を使用すると、 だけが出力されます。 で見つかった文字列を再印刷する方法はありますか、それとも別のコマンドでこれを行うことはできますか?testsed 's/test.*/test.*sedsed 's/test.*/[reprint test.* here]\n/g'sed 's/test.*/test.*\n/g'test.*sed

's/\(test.*\)test/\1\ntest/g'また、 のインスタンスが 2 つしかない場合は機能しますtest[random characters]が、 が 3 つ以上ない場合はsed も試しました。文字列 の場合はtestfsdfsdftestfsdkflsdtestsdfsdfsdf、次の内容のみが出力されます。

testfsdfsdftestfsdkflsd
testsdfsdfsdf

答え1

近づいてきました。必要なsedコマンドは

sed 's/test/\ntest/g'

各 の先頭に改行文字を追加しますtest

\nさて、GNU sedやおそらく他のものもそうしているが、改行としての解釈はPOSIXコマンドを移植可能にするには、リテラルのエスケープされた改行が必要です。

sed 's/test/\
test/g'

testただし、例のように、が行の最初の4文字である場合、出力の先頭に空行が作成されることに気付くでしょう。それが起こらないようにするには、次のようにします。

sed 's/\(.\)test/\1\ntest/g'

.任意の文字に一致するので、その前に何らかの文字が存在するかどうかtest必須それ以外の場合、正規表現は一致しません。つまり、がtest行の最初の文字列である場合、.何にも一致せず、置換は行われません。

ポータブルな代替品としては、

sed 's/\(.\)test/\1\
test/g'

GNU sed を使ったいくつかのテスト:

$ sed 's/test/\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'

testfsdfsdf
testfsdkflsd
testsdfsdfsdf
$ sed 's/\(.\)test/\1\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'
testfsdfsdf
testfsdkflsd
testsdfsdfsdf

また、 も試してみましたsed 's/\(test.*\)test/\1\ntest/g'が、 のインスタンスが 2 つしかない場合は機能しますtestが、 が 3 つ以上ない場合は機能します。

これは.*貪欲なため、つまり、できるだけ多くの一致をしようとするためです。たとえば、

grep --color=always "b.*b" <<< abcabcabc

最初から最後まですべてを色分け/一致させる最後 b

関連情報